{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>movie_id</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>47</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:32:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>293</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:31:43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>296</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:32:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>653</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2004-09-10 03:08:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1080</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:42:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id  movie_id  rating            timestamp\n",
       "0        1        47     3.5  2005-04-02 23:32:07\n",
       "1        1       293     4.0  2005-04-02 23:31:43\n",
       "2        1       296     4.0  2005-04-02 23:32:47\n",
       "3        1       653     3.0  2004-09-10 03:08:11\n",
       "4        1      1080     3.5  2005-04-02 23:42:55"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取数据\n",
    "df_rating_training = pd.read_csv('./data/rating_training.csv')\n",
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义一个函数，构建id <=> index 的关系\n",
    "\n",
    "def df_id_to_index(df, obj_id_name:str, obj_index_name:str=None):\n",
    "    obj_id_to_index_dict = {} #构建映射\n",
    "    obj_index_to_id_dict = {}\n",
    "    \n",
    "    ids = df[obj_id_name].unique().tolist()# 拿到所有的id\n",
    "    \n",
    "    for index,_id in enumerate(ids):#填充映射关系\n",
    "        obj_id_to_index_dict[_id] = index\n",
    "        obj_index_to_id_dict[index] = _id\n",
    "    #改值    \n",
    "    df[obj_id_name] = df[obj_id_name].apply(\n",
    "        lambda obj_id:obj_id_to_index_dict[obj_id]#将指定列的id换为index\n",
    "    )\n",
    "    #改列名\n",
    "    if obj_index_name:\n",
    "        column_names = df.columns.tolist()#取出所有列的名字\n",
    "        for index,column_name in enumerate(column_names):#遍历所有列名，及其索引\n",
    "            if column_name == obj_id_name:#当列名是函数传递过来的id_name时，将列名改为指定名称\n",
    "                column_names[index] = obj_index_name\n",
    "        df.columns = column_names#将列名重新赋值\n",
    "        df[obj_index_name] = df[obj_index_name].astype(int)#修改index的数据类型\n",
    "    #返回两个字典\n",
    "    return obj_id_to_index_dict, obj_index_to_id_dict\n",
    "\n",
    "    \n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_id_to_index_dict,user_index_to_id_dict = df_id_to_index(df_rating_training,\"user_id\",\"user_index\")# 目标函数的格式\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_id</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>47</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:32:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>293</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:31:43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>296</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:32:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>653</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2004-09-10 03:08:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>1080</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:42:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_id  rating            timestamp\n",
       "0           0        47     3.5  2005-04-02 23:32:07\n",
       "1           0       293     4.0  2005-04-02 23:31:43\n",
       "2           0       296     4.0  2005-04-02 23:32:47\n",
       "3           0       653     3.0  2004-09-10 03:08:11\n",
       "4           0      1080     3.5  2005-04-02 23:42:55"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 如果新建的index值为浮点数，则建立的字典中可能有NAN，数据类型不一致导致值位浮点数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3380487 entries, 0 to 3380486\n",
      "Data columns (total 4 columns):\n",
      " #   Column      Dtype  \n",
      "---  ------      -----  \n",
      " 0   user_index  int32  \n",
      " 1   movie_id    int64  \n",
      " 2   rating      float64\n",
      " 3   timestamp   object \n",
      "dtypes: float64(1), int32(1), int64(1), object(1)\n",
      "memory usage: 90.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating_training.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* index为int32,id为Int64 id_to_index节省了内存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "movie_id_to_index_dict,movie_index_to_id_dict = df_id_to_index(df_rating_training,\"movie_id\",\"movie_index\")# 目标函数的格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_index</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:32:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:31:43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>2005-04-02 23:32:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2004-09-10 03:08:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3.5</td>\n",
       "      <td>2005-04-02 23:42:55</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_index  rating            timestamp\n",
       "0           0            0     3.5  2005-04-02 23:32:07\n",
       "1           0            1     4.0  2005-04-02 23:31:43\n",
       "2           0            2     4.0  2005-04-02 23:32:47\n",
       "3           0            3     3.0  2004-09-10 03:08:11\n",
       "4           0            4     3.5  2005-04-02 23:42:55"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3380487 entries, 0 to 3380486\n",
      "Data columns (total 4 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_index   int32  \n",
      " 1   movie_index  int32  \n",
      " 2   rating       float64\n",
      " 3   timestamp    object \n",
      "dtypes: float64(1), int32(2), object(1)\n",
      "memory usage: 77.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating_training.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# timestamp（字符串）转为时间戳\n",
    "import time\n",
    "\n",
    "a = '2005-04-02 23:32:07'\n",
    "b = time.strptime(a,'%Y-%m-%d %H:%M:%S')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1112455927"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "int(time.mktime(b))#datetime"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_index</th>\n",
       "      <th>movie_index</th>\n",
       "      <th>rating</th>\n",
       "      <th>timestamp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1112455927</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1112455903</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1112455967</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3.0</td>\n",
       "      <td>1094756891</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3.5</td>\n",
       "      <td>1112456575</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_index  movie_index  rating   timestamp\n",
       "0           0            0     3.5  1112455927\n",
       "1           0            1     4.0  1112455903\n",
       "2           0            2     4.0  1112455967\n",
       "3           0            3     3.0  1094756891\n",
       "4           0            4     3.5  1112456575"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating_training['timestamp'] = df_rating_training['timestamp'].apply(\n",
    "    lambda time_str:\n",
    "    int(time.mktime(time.strptime(time_str,'%Y-%m-%d %H:%M:%S')))\n",
    ")\n",
    "df_rating_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 3380487 entries, 0 to 3380486\n",
      "Data columns (total 4 columns):\n",
      " #   Column       Dtype  \n",
      "---  ------       -----  \n",
      " 0   user_index   int32  \n",
      " 1   movie_index  int32  \n",
      " 2   rating       float64\n",
      " 3   timestamp    int64  \n",
      "dtypes: float64(1), int32(2), int64(1)\n",
      "memory usage: 77.4 MB\n"
     ]
    }
   ],
   "source": [
    "df_rating_training.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户和商品的打分矩阵 用户和商品时间矩阵，用户的活跃度向量 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "52188\n",
      "7994\n"
     ]
    }
   ],
   "source": [
    "user_quantity = len(df_rating_training['user_index'].unique())\n",
    "movie_quantity = len(df_rating_training['movie_index'].unique())\n",
    "\n",
    "print(user_quantity)\n",
    "print(movie_quantity)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 初始化用户和商品的打分矩阵 用户和商品时间矩阵，用户的活跃度向量\n",
    "user_movie_rating_array = np.zeros(shape = (user_quantity,movie_quantity))\n",
    "user_movie_time_array = np.zeros(shape=(user_quantity,movie_quantity))\n",
    "user_popular_v = np.zeros(shape=user_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000 2100 2200 2300 2400 2500 2600 2700 2800 2900 3000 3100 3200 3300 3400 3500 3600 3700 3800 3900 4000 4100 4200 4300 4400 4500 4600 4700 4800 4900 5000 5100 5200 5300 5400 5500 5600 5700 5800 5900 6000 6100 6200 6300 6400 6500 6600 6700 6800 6900 7000 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8800 8900 9000 9100 9200 9300 9400 9500 9600 9700 9800 9900 10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 11000 11100 11200 11300 11400 11500 11600 11700 11800 11900 12000 12100 12200 12300 12400 12500 12600 12700 12800 12900 13000 13100 13200 13300 13400 13500 13600 13700 13800 13900 14000 14100 14200 14300 14400 14500 14600 14700 14800 14900 15000 15100 15200 15300 15400 15500 15600 15700 15800 15900 16000 16100 16200 16300 16400 16500 16600 16700 16800 16900 17000 17100 17200 17300 17400 17500 17600 17700 17800 17900 18000 18100 18200 18300 18400 18500 18600 18700 18800 18900 19000 19100 19200 19300 19400 19500 19600 19700 19800 19900 20000 20100 20200 20300 20400 20500 20600 20700 20800 20900 21000 21100 21200 21300 21400 21500 21600 21700 21800 21900 22000 22100 22200 22300 22400 22500 22600 22700 22800 22900 23000 23100 23200 23300 23400 23500 23600 23700 23800 23900 24000 24100 24200 24300 24400 24500 24600 24700 24800 24900 25000 25100 25200 25300 25400 25500 25600 25700 25800 25900 26000 26100 26200 26300 26400 26500 26600 26700 26800 26900 27000 27100 27200 27300 27400 27500 27600 27700 27800 27900 28000 28100 28200 28300 28400 28500 28600 28700 28800 28900 29000 29100 29200 29300 29400 29500 29600 29700 29800 29900 30000 30100 30200 30300 30400 30500 30600 30700 30800 30900 31000 31100 31200 31300 31400 31500 31600 31700 31800 31900 32000 32100 32200 32300 32400 32500 32600 32700 32800 32900 33000 33100 33200 33300 33400 33500 33600 33700 33800 33900 34000 34100 34200 34300 34400 34500 34600 34700 34800 34900 35000 35100 35200 35300 35400 35500 35600 35700 35800 35900 36000 36100 36200 36300 36400 36500 36600 36700 36800 36900 37000 37100 37200 37300 37400 37500 37600 37700 37800 37900 38000 38100 38200 38300 38400 38500 38600 38700 38800 38900 39000 39100 39200 39300 39400 39500 39600 39700 39800 39900 40000 40100 40200 40300 40400 40500 40600 40700 40800 40900 41000 41100 41200 41300 41400 41500 41600 41700 41800 41900 42000 42100 42200 42300 42400 42500 42600 42700 42800 42900 43000 43100 43200 43300 43400 43500 43600 43700 43800 43900 44000 44100 44200 44300 44400 44500 44600 44700 44800 44900 45000 45100 45200 45300 45400 45500 45600 45700 45800 45900 46000 46100 46200 46300 46400 46500 46600 46700 46800 46900 47000 47100 47200 47300 47400 47500 47600 47700 47800 47900 48000 48100 48200 48300 48400 48500 48600 48700 48800 48900 49000 49100 49200 49300 49400 49500 49600 49700 49800 49900 50000 50100 50200 50300 50400 50500 50600 50700 50800 50900 51000 51100 51200 51300 51400 51500 51600 51700 51800 51900 52000 52100 "
     ]
    }
   ],
   "source": [
    "# 填充数据\n",
    "for user_index, groupby_userindex in df_rating_training.groupby('user_index'):\n",
    "    movies_rating = groupby_userindex.groupby('movie_index')['rating'].mean()\n",
    "    movies_time = groupby_userindex.groupby('movie_index')['timestamp'].mean()\n",
    "#     print(movies_rating)\n",
    "#     print(movies_time) \n",
    "    for movie_index in movies_rating.index:\n",
    "        user_movie_rating_array[user_index][movie_index] = movies_rating[movie_index]\n",
    "    for movie_index in movies_time.index:\n",
    "        user_movie_time_array[user_index][movie_index] = movies_time[movie_index]\n",
    "    user_popular_v[user_index] = len(movies_rating)\n",
    "    if user_index % 100 == 0: print(user_index, end=' ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3.5, 4. , 4. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       ...,\n",
       "       [3.5, 0. , 0. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 4. , ..., 0. , 0. , 0. ],\n",
       "       [0. , 0. , 4.5, ..., 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_movie_rating_array"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.264, 0.264, 0.253, ..., 0.266, 0.291, 0.22 ])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "user_popular_punish_v = np.around(1/np.log(1+user_popular_v),3)\n",
    "user_popular_punish_v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:25: RuntimeWarning: invalid value encountered in double_scalars\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700.."
     ]
    }
   ],
   "source": [
    "# 电影之间的相似度\n",
    "movie_sim_array = np.zeros(shape = (movie_quantity,movie_quantity))\n",
    "\n",
    "import random\n",
    "for movie_index1 in range(movie_quantity):\n",
    "    movie_user_index1 = set(np.where(user_movie_rating_array[:, movie_index1]>0)[0].tolist())\n",
    "    for movie_index2 in range(movie_index1+1, movie_quantity):\n",
    "        movie_user_index2 = np.where(user_movie_rating_array[:, movie_index2]>0)[0].tolist()\n",
    "        movie_user_union = list(\n",
    "            movie_user_index1 & set(movie_user_index2)\n",
    "        )\n",
    "#         print(len(movie_user_union))\n",
    "        #如果公共用户过多，则需要随机抽取一定数量\n",
    "        if len(movie_user_union)>300:\n",
    "            movie_user_union = random.sample(movie_user_union, 300)\n",
    "            # 如果公共用户大于300，就随机取出300个movie_user_union中的值。最多是300\n",
    "        movie1_user_rating_v = user_movie_rating_array[:,movie_index1][movie_user_union]\n",
    "        movie2_user_rating_v = user_movie_rating_array[:,movie_index2][movie_user_union]   \n",
    "        \n",
    "        # 时间惩罚向量\n",
    "        time_punish_v = np.around(1/(1+np.abs(user_movie_time_array[:,movie_index1][movie_user_union] - \n",
    "                                           user_movie_time_array[:,movie_index2][movie_user_union])/20000), 3)\n",
    "        #用户活跃度惩罚向量\n",
    "        this_user_popular_punish_v = user_popular_punish_v[movie_user_union]\n",
    "        sim = np.around((movie1_user_rating_v * movie2_user_rating_v * time_punish_v * this_user_popular_punish_v).sum()/ np.sqrt(np.square(movie1_user_rating_v).sum()* np.square(movie2_user_rating_v).sum()),3)\n",
    "#         print(sim)\n",
    "        movie_sim_array[movie_index1][movie_index2] = sim\n",
    "        movie_sim_array[movie_index2][movie_index1] = sim\n",
    "    if movie_index1 % 100 == 0: print(movie_index1, end = '..')\n",
    "#         print(movie_sim_array)\n",
    "#         break\n",
    "#     break\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 电影之间的相似度 #### 优化程序###速度不是很快##pandas慢，np.array 快\n",
    "movie_user_dict = {}#定义新的字典，不用每次都到大的矩阵中取值\n",
    "for movie_index in range(movie_quantity):\n",
    "    movie_user_dict[movie_index] = df_rating_training.query('movie_index == @movie_index')['user_index'].unique().tolist()\n",
    "    if movie_index % 100 == 0:\n",
    "        print(movie_index, end = '..')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700..800..900..1000..1100..1200..1300..1400..1500..1600..1700..1800..1900..2000..2100..2200..2300..2400..2500..2600..2700..2800..2900..3000..3100..3200..3300..3400..3500..3600..3700..3800..3900..4000..4100..4200..4300..4400..4500..4600..4700..4800..4900..5000..5100..5200..5300..5400..5500..5600..5700..5800..5900..6000..6100..6200..6300..6400..6500..6600..6700..6800..6900..7000..7100..7200..7300..7400..7500..7600..7700..7800..7900.."
     ]
    }
   ],
   "source": [
    "# 电影之间的相似度 #### 优化程序## 快速## 查找array\n",
    "movie_user_dict = {}\n",
    "for movie_index in range(movie_quantity):\n",
    "    movie_user_dict[movie_index] = np.where(user_movie_rating_array[:,movie_index] > 0)[0].tolist()\n",
    "    if movie_index % 100 == 0: \n",
    "        print(movie_index,end='..')"
   ]
  },
  {
   "attachments": {
    "image.png": {
     "image/png": "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BmAABmAABuIw8MADD8QS5G6//XZHASHi3JNrYBUGYAAGYAAGYKDZGUCMQ4yjIw0DMAADMAADMNCkDPz888/OZZddFkuQe+GFF+CmSblp9gEU5UdEgAEYgAEYSMoAYhydKDrSMAADMAADMAADTczAxo0bnWOPPTayILf99ts7kydPhp0mZifpQITrGczCAAzAAAw0KwOIcXSg6ETDAAzAAAzAAAw0OQOLFi1y9tprr8iC3D777OMsWbIEfpqcn2YdSFFuRAQYgAEYgIG4DCDG0XmiAw0DMAADMAADMAADzsSJE53tttsusiB34oknXvVWJwAAIABJREFUOps2bYIhGIIBGIABGIABGICBkAwgxoU0VFy1k+tQymEABmAABmAABuqFgWeffTayGKcIq1dddZXzyy+/0AGnXwkDTcBAv379nI4dO2YaxOXDDz90rr/+eueHH36AsSZgrF7emeST/l0SBhDjaMx4ocEADMAADMAADMBAgQFFSP3nP/8ZS5DT4DxJp5RrGdTAQP4ZkBAnAV6fhx56KBNBTkLc3nvvXbjnRRddVDVBbtu2bQWvXnn2Rv1s3ry5rL376aefIqfjve/3339flq73udA53uv8vm/durViet70+Z7/55A6aow6Qoyj800DDQMwAAMwAAMwAANFBrZs2eL8/ve/Lw64zcA7zHbYsGHFdBgsNMZgIS/1KOFkzpw5jrw3Z8+eXTXOJPTceuutzqxZsyKnKfFa07vvvfdep0WLFoWAJjqWF5tVOx9Dhw4taxc6dOiQqiA3d+7csvUsL7nkkqrcs0+fPmXlCdPO6ZzLL7+8rJ7HjBkTOz1z3+OOO64sXW89HnbYYaHv07Vr14rpedPnO203DGTDAGIcnW8aaBiAARiAARiAARgoYWDVqlXOwQcfHHrAZwaSu+yyizNv3ryStOjUZ9OpbzQ7f/fddwWhq1OnTo68oXbdddcij7fccktVGPv555+dU089tZBuz549I6fZvn37Yp7MM6C8NeqU7aVLlzo2IejBBx+sijjmZfiDDz4oE+J+/etfO2PHjo1cV9609f3jjz92brrpphK2TD36bY866iinZcuWzqhRo8ry8OWXXzqPPfaYc8899ziHHHJIGRt+ae64447O+eef70jYHDBgQFm63ry/+uqrTtu2bZ2zzjrL9x5a//O6665zZs6cWTE9b/p8p82GgWwYQIyj800DDQMwAAMwAAMwAANlDMgjZeedd/Yd7PkNLDUIXbNmTVl6dO6z6dzXq51XrFjhDBkypCB0nHLKKYHBRBTFtxqCV69evYp8SwiJYjsJ1ttvv33xevfzMGjQoEhpRblvrc9dtmyZVZCTMFlNr0B5Qe65554l9pUQ9+abb1bdths2bCisgeeuQ9v+n/70J0dTUcPUgc7TNF5bOu5jEprXrl0bKk3bfbt37152jxNOOMFRhGzb+RyjHYaB/DCAGEfnm4YaBmAABmAABmAABqwMSFRwDxzD7p977rkOaxXlp8Of98GXWAnLljlvwYIFVmbDllWC8V577VW8r6aqhr1W58kD1OTFu7VNYYySdt7P/eqrr5zDDz+8rPzt2rWriiD3/vvvO3vssUdJ+hLiRo8eHamOotrx+eefL7mnt15ff/31SPeXOHnDDTcEppnUk3jJkiUl6R999NHO+vXrI+Uzqp04n7YdBqrDAGIcnW8aaxiAARiAARiAARjwZUAeQ95BaZjvt99+e1UG5nT6q9Ppz7MdNV1UgQEmTZpUWA/uvffeK6wN97vf/c6XvVdeecWX2TBl/cc//lGS9mWXXRYpPS3gv99++5WkYZ4LCSJh8lDP50iQO+KII8rKr+mTSTzktB6gV4jbYYcdUhfiVBfytjzjjDPKymTqVdNDo9aZplu7RV+Tltnq96hpus+XcGnS0vbdd99NlJ47bfYbv+2ljmtbx4hxdL5psGEABmAABmAABmDAlwENUP/85z+XDPjcg7+g/RdeeME3XQYBtR0E1IP9f/zxR0deljbGkqwbJ8HCm+Zpp50WmdUJEyY4u+22W1lamiZYD/ZNmsevv/7aOfLII8vK36ZNm1iCnIJo7L777iXpSYgbOXJkZvacPn16yf3dnLRq1SpWPu6//37fNJN6xj3xxBPFtK+88spY+UvKAdfTlsNAPAYQ4+h802jDAAzAAAzAAAzAQCAD8t44/vjji4M+9wA1aF9rak2ePDkwbTrx8TrxzWI3ecnZGDv22GNjcaWorCeeeGJZmgcddFCs9LQ219lnn12SnqIRN0v9LF++3CrISbiK4iGnQAM2IW7EiBGZ2lJ5Pumkk0rq0/AnRuKsVagp1SYN7/aBBx5IVL7TTz+9mPb48eMTpdUszFJO3jl5YQAxjs43jTYMwAAMwAAMwAAMVGRAosPee+9dHPh5B5V+37XYvtY1ykvnl3zU10BM4ojN+0oRKDW9NWp99ujRw8qw1iSLI7To/ps2bXL233//YrqKthk1X/V8vgQ5RRn1tgH33XdfKEFuxowZZUKchPzhw4fXxI5Ba8dNmTIlVp4k0Hrto++a6hx3fU23yKfAOXGeh3rmjrzXV1tOfZXXF2Icne9YLxQepvKHCZtgExiAARiAgUZnQGt6+UWQtA00zTFN25Ng0ej2oXzptAF+USkV2TOKzRWx1et9ZRjVdt26dZHSc9/7uuuuK4otb731Vux03GnW075saxPkJEwGecjJ89FbJ2pjhg0bVjMbKgCCxF43G2Zfaw3GqZe+ffta01O6ccsqrzqTr06dOsXKV5yycE067Rx2bT67IsYhxtFwwwAMwAAMwAAMwEBoBnr27FkcAJqBYJjtVVddFdvziEFK8w1S3HWuqYo2xiQOu8+rtH/99dcX0vETWubPnx8pPff9FABCeZSHnKbCun9rln0Jcgpe4a2re++91yrIae2+vAlxpq7c4qq7PFojMM4fC7rGtr6g0r7kkksi8/LTTz85BxxwQNHWS5cujZyGKSvb5m5fqf/a1T9iHJ1vGm4YgAEYgAEYgAEYCM2AvFxuu+224iDQPVCttD916tTQ92GAULsBQt5sv3DhQitvvXv3Ds3TO++8U0hDkS39PO3irm8oocWISh07dgydp7zZuRr5WblypVWQa9GiRYkgJyHOK07JI27o0KG5sJ+Cc/i1Z4r8G8dW1157rW+aUcW0sWPHFtO6+OKLY+UnThm4hnYZBqrHAGIcnW8abxiAARiAARiAARiIxMCWLVucc845pzgY9Bu0uo/feeedke5Bh796Hf56t6WiqrpZMvtt27YNxZR4NR5bivA7ZMgQa3qDBg0KlZ7XnhIFlSetqfjtt9/GSsObZj1/X7VqlXPMMceU2fjuu+8ueMcqYqlXiNtuu+0K9ZKXcmv9tYMPPrisDKrnCy+8MHId//DDD86+++5rTU9pPvzww5HSvOaaa4ppiee82I180G7DQHgGEOPofNN4wwAMwAAMwAAMwEBkBlavXu1o0XAjjARtzz333NiLlNOxD9+xb2RbHXjggWWsXX311aG47datW+HaU045pbDI/bRp08rSEr/PPPNMqPTcdpanqNLV9U888UTk691pNdK+BDlFvPW2CxKRdt1115LjEuIGDx6cO9tJIPPm33yPul5hr169fNNSmuJbU0/DMLB27Vpnhx12KKSnADkSm8Ncxzm0pTCQLwYQ4+h803jDAAzAAAzAAAzAQCwGPvzwQ2eXXXYJHGTKu0TCHYOAfA0C6q0+bJ6YJ554YkWuNP3PMKqonSr3559/bmVWC+JHtcvo0aMLaWn9Lnk/Rb2+kc+XIHfcccdZbW1ELQlxb7zxRi7ttnjxYt+8d+3aNXSeJbIdccQRvmkZW4wZMyZUmhKNzTWKWNvIDFE23huNzABiHJ1vGnAYgAEYgAEYgAEYiM2A1ngyA0Pvduedd3bmzp0bO+1G7oRTtmiDzJtuuqmMM63/VsmOChwiLt1RMDdu3FiWlvecSunqdwVqMNNfo6xfFybtRjlHQvzxxx9vtbeEuIEDB1asw1ra4vzzz7fmXZFjg6LEuvPsbiO1bpwRh73t5RVXXFHRFrrn7373u2KePvnkk4rXuPPCfrR2B3thrzQZQIyj800DDgMwAAMwAAMwAAOJGLj00kuLg0P3ADPvA+00O9mkXd1BnF/QhV9++cWXXbPI/Z577lninSlBQ0Kxm1Xt/+lPf/JNy1afTz75ZCGN0047rTD91XYOx/7jDBs2rMzWsrfajbCCVq3s2L9/f2velf/33nuvIi8qn/gwrClir4Rh8929lTi5fPnywDQ/+OCD4rVnnHFG4Lm1shn3rW7bhz0b156IcXS+acRhAAZgAAZgAAZgIDYDI0aMKA4O3QPLsIvrM9Bo3IFGNevWPTXPzZlfwITNmzc7hx9+eIHNnj17lvF92GGHlXGrtd/C5vnrr78urH0mAQXvT3+GFUHZu0acu/5at26da0Hu+++/L0bKdedb+7fffntFXqZMmVLk7PLLLy+cLxHPm5b53qVLl8A077nnnuK1L7/8cuC5YVnmPH9+sQ22SZMBxDg63zTiMAADMAADMAADMBCLgU8//bQsKqIGlZdccgmeQjAViym/gc+rr75aFCGMcKGt1oSzXdOxY8fC+ZrSZ1sY/+yzzy5LT+u+2dKyHdN0Q92/VatWoa+xpdPIxyoJcaYe8y7ISXQzeXVv99hjD0eib1Adur2GFThE58pbzhbcQmkfeuihvm2nogprarbOk8D53XffBd47KF/8hsgEA7VnADGOjhKNOAzAAAzAAAzAAAxEZmDDhg3OkUceWTZI1TH9Rke/9h39RqqDkSNHlrEmUWLevHllrC1atMjZcccdC+dPnz697HfZRZFY3cKK9rfffntfIcRtSy20r/PFOkEb7JzbhDjZV95cJ5xwQpntJWrmdcrqzJkzy/Jr2Bk0aJCVL/Hy8ccfF6/TlFJ3+Z5++unibyYtsx0/frw1TUWcNee410B0s8m+nUfsgl3yyABiHJ1va2OfR1jJE40oDMAADMAADOSDgZ9//rmwvpYZGJrt7rvv7nz22Wf0LehfVp0BiTuGM/dW0wDd7YIED3lm6hwFfXD/5t6/6667rOmtWbPG9xpdv3LlSmffffctXOsn9Lnv04z7qhNvkIIddtjBGT58eMG2srEi4brrUfuKDOoWrPJiO+XJz5MtaJ3Bv//978Uyat08d3nWrl3r/PrXvy7+7rbFX/7yl5JzzXWGa5377rvvWs8x57LNx7uSeqAeghhAjKOzREMOAzAAAzAAAzAAA5EYeOCBB6yDyNGjR0dKJ6iTym8MYtwMyAPOLViYfa1Z6D7PBAuQMLxq1aqS39znde7c2ZpeUHRKidAXXnhh4bqWLVv6pu2+T7PtT5482SrEeetJYlQ9CXImWIfhzmy1ZqAEWm89a01BCZA674gjjrB6XF533XVWBnWdl92vvvqqeO4xxxyTS9HSawO+04bDQDADiHF0vsteHjw0wQ8N9sE+MAADMAADzcyAe6qUGZBqK3Gjme1C2dNtF5YtW1YUI9zcKdqlsf2mTZucgw46qHBejx49isfN7+5t7969rem9/fbbvtd169atcM1JJ53kaP0ud3rs/8eZNGmSVYjTFGObffwEOQmdefOQkzimabZu9sz+E088UVa+Nm3aFM994YUXyn6XPSZOnFg8x6Rltt27dy+55tFHHy2ea7ufzb4cS7dNwr7YNykDiHGIcSUNfVKguJ5GCQZgAAZgAAYalwF5J3mnn2nweM011zi//PILfQr6lakxsHHjxqIYYQQLbd1CR7t27QrnHH/88c62bdsC8yIvTnc6Zn/AgAHW62bNmlUQY8T//Pnzrec0c9sXVYgztpIgpyAbxv5mm0dB7sorryzLp/J73HHHlYiHivArz0z9ts8++ziKyGrK696qzfztb39rTVPrEZo2VVt51yk9m9ecO032G/f9S902Xt0ixtFpsr4ceNgb72GnTqlTGIABGICBJAx888031oGjFmOXR1KStLkWNisxIEHCCDXu7eOPP15gT2sVmmmB3nXkbGnPnj3bmt5TTz1VxrKEwMMPP7xwvjzqbOk18zEJcTvvvHOJPVUXo0aNCmWrehHkVB43e+79OXPmFMsqrzbzm6L6BrHRpUuX4rnmGrPVlF9dqyis5pgCjwSlx2+0pTBQPwwgxiHG0aDDAAzAAAzAAAzAQCADP/30U3GtLDMo1Hbvvfd2Fi9eHHgtA4P6GRjkva7Em5s/7T/88MMFr6Tzzjuv8Nv1118fike/aa/3339/yfWaLnnDDTcU0tbC+nmbPlnrOnvnnXcSCXEm/xL7Nf3XW7/33ntvbmwub8v99tuvLI/Kc4sWLQrcbNmyxTnggAMK50igrBQQRGvLad05b7n13bB8yy23FH8fO3ZsCZ/GfmxpZ2Gg/hhAjKPzTYMOAzAAAzAAAzAAA4EMtGrVqjgYNINGDSCD1tdiYFB/A4O815nxTjMManvPPfc4r7/+eoHP3XbbzVm+fHkgy6aMEk3c6Zj9m2++ueT61157rXDewQcf7Kxfv77kN5NWs271/Hs94hQhNG4gFz9BTkJXXkRQibWGFfdW01HFVN++fYu/33nnnaF4ueyyy4rXuNPccccdnSVLlji77rpr4XeJfPpjpFl5o9y8UxqNAcQ4Ot806DAAAzAAAzAAAzDgy4AWyHcPEM1+pQXyG63TTHlqPxA89dRTy1j8v//7P2f//fcvHI+6sL3N007pmbrW1EOJTVq4f/r06cXj5vc8bCUAPf/8884pp5ziKO/vvvtuJvn0E+LGjBmT6P4S5E4++eSyepbomgdBTtOhTRvo3SqSryKdmuOLFi0KZQsFuDDXeLeqV3OsQ4cOodLLA5eV8qDosLfddluhrhWde8OGDQ1Ttkpl5/fav0vyUgeIcXS+afhgAAZgAAZgAAZgwMqAxIiddtqpOBg0g0J5D+VhYJyXDjX5yGZwddFFF5WxaJg89thjna1bt1o59qsfLbxvrjdbBRPQ+StWrChON3z22Wcjpet3vzSODx061JEHlcn/UUcd5WgKbhr3MmkqCqjNI+7NN9+syn3XrVuXa0HurLPOKtrb2F1bMz1V+wpqY+xVaavpr0ZQdqfn3W+UJQEU0EL2cZdPwVd+/vnn0DarZFN+z6ZNxs7J7IwYR+ebRg8GYAAGYAAGYAAGyhhYvXq1c9BBB5UMmDR4Ov30053NmzeXnU+nPFmnHPtVtp/WbHMP4N37caZMX3jhhWXp/eY3v3F++OEH57TTTiv89re//S23wrOCWnTq1KmkDHvssUeq3nES4rwCvaamVkuIM8+BBDm3V5ip67vvvrsYZdScm/VWQTxMfvy2M2fOjNRGtm/fPjDNCy64IFJ6Wdskyv1WrlzpSDx3205enX5RZ6OkzbmV21FslB8bIcbR+W6Yhp2GJT8NC3VBXcAADMBAfTMgD6Nzzz23ZLCkgZO8N8KuyQUD9c1AHuvvpptuKmNSXF577bWx+rM33nijb3pKV2KQhLk82sLk6a233nK0Vp4RNjTFc9WqVankWYJnFkKcKZufIHfXXXfVVCBVdF2vZ6Cxv7bnnHNOZPtrSqs7De/+wIEDI6dp7Ji3rZ4pr7COZxzvi7xxmkV+EOMQ4xqmYc/igeEevChgAAZgAAaagQF5n3gHg/J+ee+99+g30HesGQO33nprGZda3F7rT8V5Llu3bl2WnuFeUTPjphsnL3Gv0dS+ESNGOFdccYUj+8yfPz+WLcLcf968eY4CFRgbaXps2tE9bYJct27dUitjGDvoHE3VN3bwbuMGsDj//POtae65554N542sKLL/+te/HK0DKa9A1oyjbxX22Wuk8xDj6FDV/GXWSA8UZeFFAgMwAAMwUO8MvPLKK9YB4csvv0yfgX5jTRlQdEqv8JFEmFHAB296+i7hOatACPXWXhhBTkKcvPKyyL+i2Jopq127ds3knpXKNWXKFCs7Rx99dOxptCYqsJdJBa+olB9+p+8BA/XHAGIcnSoadxiAARiAARiAARgoMDBjxoyCEOEdDMpTjo5+/XX0G63O7r333hIBRMEKFE00bjn9IgX36dMndppx81JP10mQGz9+fKY2kiCntdryYiet13f44YeX8Kh2M8mfFlqLc6+99ipLU/bOS7nJB+8BGKgeA4hxdL5p3GEABmAABmAABmCgJHqkW4zT2nFRo1TSWa9eZx1b/s+Wbdq0KREqkgpCCkbgZl37LVu2pD2kPQzFQJcuXUr40dTmH3/8MdS1fs+1V3CWR6DfuRz/X9uALbBFPTKAGMfLhgYeBmAABmAABmCgyRnQAPLMM88sGVhKmDjkkEOcNWvWwEeT85GXQc6DDz5YZPTqq69OzOXHH39cTE+8//nPf3a2bduWON282It8pCtQLFu2rISfRx99NDE7H330UUmaL7zwQuI04SBdDrAv9o3LAGIcnSsaeBiAARiAARiAgSZm4N///ndh4Xevh5CiBX744Yew0cRsxB1gpHVdx44dC0KF2Fy6dGliNiU0G+7PO++8qi6Sr/x16NDB+eMf/+hoza+VK1dWzK+ioGqquAKlzJkzx/n+++99r9H0XE1f1FRbRaJU8AaJQ2nZnnTtgsPFF19cYEiBRBRsohp2Ov3004ucZxnYIG1mZRt5WYvbvn37OvICfOyxxxJNNa+GvUnDzjZ2Sd8uiHF0sKry0uBhTf9hxcbYGAZgAAZgIA0G5HlhBAn3dtCgQfQR6CfmioHnnnvOOeigg5zu3btXJV+KRCrvT03F3rhxY1XSlNjwzDPPOLvvvnvJcyXhQffze4Z13T/+8Y/iNVoPzx3NVd6rSveSSy5xDj744OJ55pk9++yzHa2r5pc+x9N5fwwePLhQF9Wc3qx151SvN910Uyb1mRazYk6CtwKlXHvttY6CW2y//fYl7Hbu3Dl2wAuYTodp7JqdXRHj6GRl0sjzUGf3UGNrbA0DMAADMBCWgWnTpjk77LBDyeBIg0B52oRNg/PgDQb+y4AEM61rJ8+9XXbZpeS5khgh0cPPVitWrHCOOeaY4jXXX399iceQPOFGjRrljB49uvA566yziufqmdV9g8Q+v/tyPNnzq0AOmzZtcn766Sffuo1qY9Wj0gziJWqafuenyazuKW9PiYsDBgxwrrvuuhJmJVhPnjy5anbzKyPHkzGO/dKzH2IcYhwNIAzAAAzAAAzAQBMyIK+b3/zmNyWDIw3qL730Ugb1dciDxBoNfDUdMuxHXiuVBBz9vnr16opprl27tqk9XGQnTbnTFMMFCxYUBDOJcnqm9GndunWgrd98882CiKdz5T1UKXLok08+WUx7p512ckaOHEk7XofPbS2FjqyZVTty8sknF7k98cQTC21WLW3AvdMTmrBtZdsixtFo8+KGARiAARiAARhoMgZ++OEHR1H6jFBgtpoal+UaRXTWK3fWw9poxIgRzm9/+9uyaWCmbt3b7bbbzjnggAOcG2+80fn2228Dn/8PPvjAOf744x1d407D7Es40rTJ2267reDNEza/jXbeW2+95fzud78rrPWmsvXq1atoM3mfvvbaa752liiiaY7Gpv/v//0/R8El/GwkLyzZ25x/2GGHOV9++aXv+X7pcLx6z1892jJLZmWfxYsXl0yxFsPV9Cisxzogz839DCLGNVnnmwe+uR946p/6hwEYgAEYUMAGrUVkBvJmqylD8+fPZ0Bf531DTW2Tl5VtXbE999zTef755wMDA/i1EVpTTdEid9xxxyI7GkzLI87vmmY5rqmKEyZMcN5+++2CLVQHf//734t22meffRxFyfSzhzwa5SVknsXzzz8/cA07eTSeeuqpxfMVWVbTDf3S5zjtvpeBrJnV/YcNG1ZsP379618Xpq5688V3WG0mBhDj6rzD1UywUlYaZxiAARiAARhIzkCPHj2Kg3gz+NdWa1E1on0VkVIiYzN5YHg9rVS/EtH69euXqI7lRXfOOecU+Lnsssua2hMu6FmRuCZvQvN8/eEPfwj0QNQUU001NecraqzEEr97zJw505Gwas5XYAe/czmevM1sBhumzazaJAUxMcweeOCBzsKFC+EWLaKpGUCM4wFoqAdA/wqOHz++sG6GXirN8PLMaxnleeGOAhYmn5o2NW7cuMICxY38T7sWaX7jjTcK/xB+9913oTnVdUGd8zA25hw65TDQ3Ay88847xalzZlCkbdeuXUO3RfXGkLwxVEaJUZ9//nnDltNdLxIeb7/99uLAV+VXxNCkU5DXrVtXWBNNa6EpmID7nuz/r23RovTuaKrt27f3XS9OfdcbbrihWFe77babo+fUz57qBzz11FPF8yXKzZo1y/d8v3Q4/r/6whb/KQRSSItZ2Vf9+tNOO63I7Z/+9KdYHrrUFdw2EgOIcYhxDfPyVmjxfffdt9jIa30Orb+hf2Ia6aHNe1kkwg0fPrywFtG//vWv0LZ/9dVXnb322qtYfxo0Pfjgg47Sy3uZw+ZPHWgx6Q7rrk73Cy+8EKqMnTp1KthVgmUj2SWs/TiPDhgMJGNgyZIljqbLuUU47f/lL39paKH/zjvvLJZZf/o0A0eKxHjhhRcWy6161oL/Sf/QkSeL1prT2mj86Wl/HmVjidvmOVNUVa3N5ced1uTTGnHm/BNOOCHQtmL48ssvL54vgaOR/8D0sxvH7fzFsUvazCpP7733nrPHHnsUue3WrVvi9ihOWbmmetxgy+S2RIxDjPPtHNTTAyZ3fb+FhTt37twQZayH+pAnnP7pUodSEfq0Zk2YfOsfYNMJ9W41nSpMGvVwjjoe3vKZ72FsNXXqVGfvvfcupPF///d/ztdff90wtqmH+iOPyTsd2LB2NpQ4IwHFtDlmq3Wq9Fuj1o3+uDj88MML5VZwg0Ytp7dcX3zxhXPQQQcV61t/ds2ZMydx+c2aT3fddVdTTfv12jfou56niy++uGj7o48+2vd9rbXl7rjjjuK5ei5vvfXWQNsuWrSopG5btGgReH5QXvmtdm1ynmyfNrMS+x5//PEi5/LAe/fddxO3R3myIXnhWYrDAGIcYlxDNITXXXddsYE3Awyzlbfcli1bGqKccR7yLK7RS7Z3797FKRnqpEeZCnPppZf61p8WoG4E78Zt27Y5++23n285L7jgglCMSoDTVCPxrcHVoEGDQl2XBQfcg44IDOSTAQlSf/3rX8vaH3nJyVuukettypQpxXLrz6JGLqu7bEOGDCkulK73xdlnnx3pvexOy+zrXXzfffcV0h06dGgp1RplAAAgAElEQVTT2NKUP+xWU6G1Hpbph/7tb39zJLrZrtd0VnkamnPDLGqv977O0zWaRUBd5LPdtdV3Xo+lzazW7XT39RXJW0FI8moP8sUzlRUDiHGIcQ3RELoXyTUdGvc26tplWT2AjXCf5cuXl0yF6dmzZ2SmDjnkkGJH1F1vZj+KsJdXm2q9N1Me21aicdi8S1x2C9A33nhj4kFW2HtzHh0UGKg/BmxeufImD1qXqlHq2d1WapmARilXUDm0Xpz+FHO/a9q2bZv4j63169c7Z555pnPooYc2vIgbZN9Kvw0cOLAolmlZij59+li50/p7Eijk6W5md0jEC1rXUHXr9qTTH5bylKuUJ36vv3Y7yzpLk1mVQ0y7PXXxrIXHLPnO870Q4xDjGuIFftFFF5V0Ot0dUP17GGWR/Dw/sHnL24IFCxx1BGVvrdGnl3mcPJ5xxhm+9ac11fz+UY5zr1pdoykA5p9sN59m/5hjjolkO3kjtmrVqmg31QMu/3RuasU3980ve1pj0rQz7m0zRF/UmmZ6N5lyv/jii5Ha2XrlWh4n8jwx5VawhTBLIVQq7+zZswse2VdeeaWjoAOVzm/G371imZbs+OSTT8psJS/DRx55pPDH2hVXXFGsK4lz8iLys93q1audk08+uXi+Ito2yzqIfjbheLL3T9rMqn5ef/31Yh9YfWF57lJvyeoN+zWG/RDjEOMaojFUZErT6fRuFaGKBqv6DZY65WYhcC1OrAFfXDtriqu33sx3/QMcN928XaepKqZc3u0TTzwRuZyaeta9e/dimhpwBS0SnTd7kJ/qP5fYFJu6GdC6YYq06G1vbrnllqYIAvPoo4+WlF1TAt32adR9/THjjop41FFHRY5ubrONBFx5cDWDkGsrf5hjXiFUQTRsazKqz3Tqqac648ePd4444ogip1pXS3+2+d1r2rRpJXVb6Xy/dDjOu8IwkDazEvtuu+22IuP683jx4sW+jJt8sYXRZmAAMQ4xriEaQ4kS7mhpZuChiFSsSVD9xnzChAnOrrvuWnixagqG1uRJ0mDqH+Kbbrqp+KI29acIYd9++22itJPkq9rXikXblGr9s53E+09Tr4zN5AWiBbarnXfSq/5zhE2xaZoMyCP8uOOOK7YNpo2QJ3IzeDXJg8gdoVLlX7lyZaFt1ODw7rvvLr7HjG3M9rzzzisTULRep9sjyZyr7U477eSMGjUqcrsr0eWjjz5yFClbHv6axuWOtu2+h3dfYtv06dPL7qk0vdOSr7/++sRr54qZq666quAZpz/j0mS3ntNWQDG3AK669Yprmlaq/o2iyI8YMaLAj+pXkSYVcdKv/ErHLTCzCD7vED9WohxPk1nlQx7KChRk2jB5guLNCbtRGG3kcxHjEON8X/r1Br4EOXViFFXqn//8p9O/f/+mGHBkXU9vv/120dVcL9bHHnusKgyp/iTqaYCkSGJaoDiJQJW1XcLeTx2Qvn37OhocyTtl9OjRiaOgScz84x//WOzoSJDDQ46OTlgmOa/xWNGgXVMJzeDHbPfff39H63w2ep2r/O6pfyq/hAu9Z7xllxh20kknldjKJsaZ6+TlJE9mCXDGrlHFOOVP0bFNMB6TTpStnxjnjYooce+ll14qK7cpT9itAn1orbizzjrL0dpxYa9rtvO0bq6pR/1pqT8v3TaQ7fQHnPo5qqs2bdoUz5enXNAfyDpf68uZ9CUOS3RW+mJKv7vvxX7jte1p1GmazCq/8khWe2W4ffrpp+EU/QEG/n8GEON4GHgYYCA0A3Ir33vvvYsvVA1YJASl0TkgzWidSHXg3RHZNGX1ww8/pG54vmGgCRnQWlRm4GO2WqdnxowZTcHDQw89VFb+008/3bfsWurCvaZnkBind9PGjRtLhLQoYpw8zJQ/9/0OO+ywwjSuF154ofAHjf6Y0nTEoI/q0ia+aC1X97tAwYEkOCZ9p8rjWpE7JR7x3re/n+VxqT+DzTN35JFHlkwPVn1JhFNkWwV1UnCq3//+98XzNZVPaejTtWvXwsdta2/d3n777cU/8xRRVUIpAcvsdZOU/0a9Pm1mJRK730fyGpUnXqPak3Lx/EVlADGuCTvpUSHhfBoWMaBOpNvNXJ3yoIhfcJM9N+qMm0GAtvJiWLt2LZ0e2nkYaCIGNF3S3Q6Y/VdeeaXhOZDnsW3JCtlASyH4vZe0xpqmCBpbVRLj5LXtXgM0rBgnIe7ee+8t3kdBFrRmmFtw8ctj2OOaFeAW+uR9l3S5Bw3Y77nnHkd/8owZM8bXjmHz2Kjnyc5ub8cLLrigKJjKI07e8IoeP2fOnIINP/30U0cBHsSd1uJTgBGJFxKH1d/yBn4YMGBAsW7lAd+vX79COhJmjz766MK0V13fqPalXNXvV6bNrMYOWjfRtK36U0RRhKnL6tclNq1PmyLGNVEHnYe0Ph/SPNSbpvZce+21xZepXqoPP/wwL9OctR+qJ0ViM50ebdUJ0kAqDxyRB9ogGEiXgfnz55dMBzJtgYSURrf9vHnzHEWlNmX2brXWlp8NJI7stddexWsriXFeb5IwYpxEkueee64Y3VWioc2zzS+PYY5LJHR7ZskG8sJLKtDI81pTKL2eXmHy1EznaG0s97qwWgPwtddeKwS8kO0kvE2aNKnIoXu9OAmoijipJSZ0rv5cc9tOgq17fVgxJ29FLR0iz0qtTdeIS3u4bcB+9d8faTKr+pLgvN9++xXbVjFczT8fYKL6TGDTbG2KGJezwTQPQLYPAPYOZ2+tj+Me2Gjth2oPIqiLcHVRyU5a10eddHd9dezYsaRTXykNfq9OXWBH7JglA/JwUNRM97OvfQlL27Zta8g2QO8hCRJaH65S4IOgwDZZiHEalEqcUZ3cfPPNzvfff1/1OtHA2h20Q2uWyfMuKYfGc/C6665LHAgiaV7yfL0RLb3PoL7LU90b7EqecN5z9f7WdGWvYCGh7S9/+UvZ+RLxJMRt2bIlcT3n2bbkLZ33aZrMqs769OlTbJvFtgRo6jKdusSu9WlXxDjEOBpFGAhkQFNRNSXV3WHUOiU0+vlt9N3ToFRvms7ine5C/eW3/qgb6iYqAxq4e71ijQCgwVbU9PJ4vrzRtGaWPIbkmX3xxRcXp+y5309++0FtYNpinOqnffv2hfeopimqHGnYWF5Su+22W/F9LU9BrU2W5F7yqnv88ccL0yirEQgiSV7yfq1spT8v9c41HGr6qUQ0/VHmzf/YsWOdXXbZpXiu1voT3zZPRh3r3r17oR5M2ooWrGnJXuHOex++807xYyBNZiUga3kAw6s8OJcuXVr2HPjljeNw2wwMIMYhxNAowoAvA5r2qDVPzIvUbM16J83QSNZjGZctW1bSYVe9nXHGGXTYedZ9n/V65Jw8/6+j3qFDh7J2Ws+9vHH+8Ic/1O1Hi9treuSxxx5b5vFr3kdht5s3b/blP20xToKo1odTXt2L7leTYQ2q3Qul614aCCeduijvQ0XwlPDz8ccf+9qwmmWp57QkjMkbsV27dk63bt0C/wiTwDxy5MhCUIyXX3654lpa8n7TVFZN9ZP3XKMI7fVc342Q97SY1R8BWsvQtNFaZxMPzv+9txuBHcqQvD4R4xic0bGCAV8GtIiweYma7cknn+xIpKMBTt4Ap2nDq6++uqzuFL4+zXuSdr6ZoH4as368gVtMW832V8U28PDDDw9s+9IW47Sendak05TCwYMHB+Yl7nNqRDNT75q227t378T3UiRWCXFaf5TlKRqzDYnLHNfBQxADWv/QeH6q7Rs4cGDi9ijofvwGj/XIAGIcQgwNIwxYGVBUOk2nMR17s9W/sfXY2DVbnrUuh6kzs9WAisEUnZVmexYaubwSSrQumHnG2f5PgHPbQlN4gzhIW4wz0xElkJ1//vnOVVddlfjz97//3Vm4cGGxXJoGefDBBxdZkPj3wQcfFH8PKn/Qb88++2whTQXAsE2fDLqW33jfwEBzMuCemq+2WB5yX331VeL2CJ6ak6dGrnfEOIQYGkYYsDKg6RXuwYz2d955Z0eLhDdyo9goZdu4cWPJujWmLlWvjVJGykGnrJkZWLduXSGKonm22dqFONmlVatWge1e2mKcgkd4115NWl8KpDR9+vRiuaZOnVoSSVdRPRXQIckzoveIPOIk7M2aNStRWknywbW09TBQXwysX7/eOfvss4vjCAUZQcyvrzrkmcumvhDjEGLoXMFAGQNaY0YLCXsHC5W8C2i4s2m4w9pZURS9dbj33ns7GmCFTYPz8lWn1Af1IQa01tQf//jHsufb+7zz/b8CXaXAA2mLcWa6lhbzP+200wp1p/pL8rnmmmuczz77rNiWDxo0qCSgxUUXXZQ4YquiqO65554Fbz7eG7Q9vH9gICwDJgKz3kEK3KBgcGGv5Tw4ayYGEOMQYlJpHL/77rvCP7a9evUqhFzv0qWLo/Wqhg8f7qxdu9Z6T3WGH3roocSLDesB1j8ymk6p9GbOnGm9X9QHfdGiRc5jjz1WSFPpV7pe0wEVxr5Hjx5Ox44dCwv5ag022abStUG/y827X79+jqaM6J+mp556qlDGakbTsq0VpxdqVl5VYuS5554r2PrDDz9MZK8gW9b6t5UrVzpPP/10oZziq9r5UeQ122Bcx6t9L9Kj8wQD2THQpk0b67Nte9459itHXmNBfKYtxinwwT777ONUax03W1n69OlTErhHETyTBG9Qn0KcSUB85pln8GphvBD4DNmY5Fh274Q82Vptx3333Vd4R2mtuBdffJH2g/aD9sOHAcQ4H8PkqVGrp7xofRJFy9F0xqABgIIA3H///c7EiRMLwplCXStamq7RWmVxyqygAhLe/vGPf5TcP8mi9du2bXM0vcTrgfDll1/65lELNcsGO+20k9UGOq7F9fWvUdhySvyT8HbkkUda05Td9t13X6d169ZVmUbqdi1312OUPIctmzlP9acpNzfeeGPJdJ7XXnsttJ1MWnneyk3/7bffdjRQ0sDM2FfHqp3vuXPnFtM399H2t7/9LZFVafurzlu1+SU9+0BO0RTdzzP7/tNTjW0qTddU30VTMc358ioOWl9Tnon//Oc/i+frva6omH7M6h1+1llnFc6//PLLE3us2e7Tt2/fEjHu2muvTSTG6Q8iBb7QOnR4tdifRVs9cAxbNQMDatNuu+22QvvQtm3bkjZNfz4cdNBBhfZOEZ2D2tJmsBVlpE0IYgAxjgGZb+cxCBzvbz/++GNhTRbTkTVbLRh/4oknOlq75MADDyx2XM3vtm1UMU6eZvrX5aSTTrKmH0eMW7ZsWcFbyTZVU3m2iXEbNmxw/vrXv1rzYCun/m2Wd1tQZFL9prK5Bwm2tNzHDj30UCeJN5k8BNzpmX39u6V69tZ90u+ym+rouOOOs963UcQ4efs9+eSTvoJqGmKcvCJUb6YO3dvx48dXvS6TssD1dFhgIJgBCeyV/uxyP+fs/8rZY489At+zYk6BMDSF39jrnHPOCfxjyyvGaT04ef778as/Ybp27VpIX2u9pdHejxs3riSYx+9//3tH71e/PAUdl2fLww8/XMhvy5YtC9Oig87nt+DnFvtgn0ZjQGMTjWPUZmqs9MUXXxTaGol0+sNBx+V4oO+NVnbKw/NcTQYQ4xDjEjeS33//vXPBBRcUGl7Tkb3zzjud9957r8wtWeubaOqo1g8w53q3YcU4eaDdcccdzm677eabltIOK8ap86mIZ+Yl4s2X+7tXjFNHPqhM7mu9+w8++KC1DuSVd8sttwSWzZuW+a4Xo9904EoNiN89TznlFGs+K6Vn+10i4+zZs51bb721GPbc5N27rWcxTuWUN6E8JSst3p3G4Ey2V715barv1113XdXq01bHHKOzAgPVZ+CII46wPs+2Z5xj//WYO+OMMyq2dRpI7rfffkXbqt1cvXq173X6o0PRTI2N9afH4MGDfc/XsyBPM1N/EsqC0o/z7GgJi6OOOqqYJ/2JN2PGjMA8+d1HwRp+85vfFP5EVf/G7zyOV/8Zx6bYtB4Y0HI5O+ywQ2GGx+OPP15Yi3jEiBHOqaeeWpgZpLGexof1UBbyyDNXSwYQ4xDjEjWUEhs03c50SDVVY8yYMRXTVEdW/7aa69zbIDFO17366qvOmWeeab3WnY7ZryTGSbSSh9ohhxwSOk23GKeplfrn3dwv6lb/LMml290Q6AWmYAlR03Kfr+ujRi7Sv/1+ZZE7ujuPcfblWde7d29fgcidf7Nfj2KcXPLFnTxCTTkqbdMS49xTqdx5kHdN0LMWp365hg4NDKTLQKU/n9zPOPv/FeMkmlXicsWKFc4xxxxTbK/l1f/JJ59Yr9Mfd+qHuOtC73EdC7qP3sd6/xlvZf0hUk2vEeVLf+656133iDog/vrrrwt9LJVJ64tG7UcE2YDf0m0fsC/2zYoBBXSR44Vpz9Tu7L///oVj8+fPD2wLs8oj9+F5qAcGEOMQ4xI1mAMGDCjp+EVd4F+BDdwdR+0HCQQSi+T1pYWQzz33XEfrulSaslNJjFuwYEEhD1pH68ILL3T0L7o3T97vRoxTgIZddtmlcL62Ej4U0WzJkiWOFuc3noDuTrs3LX1X1DMJm2o0vvnmm+LaMvpN5dPaL88//3zBy0r/WGuK4V133VWx7JX+qfc2UvoX3ZY/HVMwDu/5Ub9v3ry5MOVWAx3VnerQ/SK33bsexThNDZIwLVbPP/98R1Oe3OvD2cqZlhinAB+2++mYIvxFrUPOp3MDA7VjoEWLFs6//vUvPhFsMGrUqIrtnASrSy65pKStfOCBB8qmZ+qPFgleGnQeffTRJedrHVwJYkHPh/o3enebNvn0008vBHqqluAl7zityWvS13tHHipbtmwJzJfJ8+LFiwvvK12v9VtZ66l2z7qpE7bUQZ4ZUBuhdb9pK+A0z5zmOW+IcYhxoTpoNojV6dT6ZKbTJ4+qqP/ASoCSWGHS0DZIjFM+NNVDUzhNniSmudd6cael/UpinNJZuHBhUQzTdwlq3nTc3yXGTZ48uSDE6d9jda6DFohes2aNc8UVVwSmqWhvepmpc657qROtgAy61pTVu9U95RLuzpt7X1NhvNcEfe/cubNvWu+8806ktPzuo/pzD1g03ThIrKxHMU5l17Qn9wBL01WDpqqmJcZJuHUz4d6/++67q1KnfnXNcTpnMAAD9cCA2mpFDNX73LSR2tcfYQrMoPZZ70cFNND0TwV2UrAoc662e+65p9OuXbuCWKd+h/s957aB3vP33HNPyb00vVReJvrTa/To0Y7et5MmTQr8yCtf3inutLWvP+wUdMGdt2uuuabQz/Gea74rT/rDz0zV1fq31fTaM/dhS3sAAzAAAzAAA/9jADEOMa6sIxf2AZFXjbuzp2ioYa91n6cOpzudSmKc+1qzL1HBnYZ7P4wYZ9Jxb91rr7jT036fPn0KXmnyplPAA/d1fvvq7Aal2aZNG+eyyy4rlENRiLTmnl9a7uPr1q0rdqC9+dR348XnvsZvXx5ctjR0LE2385tvvtn3vvUqxtlsHDT1OC0xTsFI/OpUYrrxyLTltxrH5CUqQTDPnzSjBFfDhqTxv04LtsAWaTGgP7fMn2F+babEKvV9tGSGbQkA/bGktVAVndX9Z4w3z/LyHzp0aGCfwC8P5rgCQUiQ86at77r/CSecUNL26w8+RXTVn3w9evQo/FGp2QlaZN0EidIfRjoW9Y9VWx44xrMKAzAAAzAAA8EMIMYhxlk7cmEeHIWyNp1CbTUlL87AXtfIg8ukFUeMkzhmrvdu44pxN9xwg2+auoeElaj/HGtxU2/+zHfzj/wf//jHyMEXtHiqSce7lZdfmPpUVNqgqZS2f+DDpBvmHHkkePNtvjeSGGei05myubdpiXGanuS+j3df6wOFqaO45yiCrPeeefuuSMxxy8d1wZ0M7IN96okBLS1x2mmnWdssrVUrT26VxxtNVVNW9R7Tn2NRyitRb8KECY6mHyv9fffd13pvW5sZJMYpD1ouQd58WhbCdr37mJaLkCinaL1R8s+5PN8wAAMwAAMwEJ8BxDjEuNgdr4svvrisg2c6qlEfSvdUujhinKZ0uDuW7v24Ylz79u1909SiyH5TUILKLu84d968+/IQc0/BDUrL/dv777/vm64WYHaf67fvrgNvvnbddddYQqvfvbzHNQ3Ie0/zvZHEuL59+/qWMy0xTrbW9CljT+82TMAVb31F+Y4YF/8FHcXOnIudYaA6DMgr7I033ih4uOldr6mn06ZNK3nn6/2vKaXygpN3v8S5vNpfgZP0fu/QoUMh4JbWxtU6tZq62qpVK2fgwIGBy2HktVzkqzq8Y0fsCAMwAAO1YwAxDjEudgfylFNOKRvgax2UOA+0vOMOPPDAQnpxxDhNofSKDOZ7XDFO15k0vFstchynnLrGL8Km1twLmtYSdL8gkU/r2QVda37TejHecprvml5rzktjO3v2bN97N5IYFyR4pinGBU2PludEGnVq0kSMq90L3tQBW+oABmAABmAABmAABmAABvLFAGIcYlzsgbjf2iphIpfZGgL9wyzxJ44Yp8XyjXDk3cYV41566SXfNKOsw+Yt6y233GJNV1NOvOdG+X7YYYdZ07388stDpas167y2M98VZCNKXqKeq6kx5l7ebSOJcUEenGmKcX/4wx987fv/tXfe71MT2x+/gFSp0gXEq6IgolJFFFFEkWoDQRSUpiCI0qRcFJDeFAQBBRQL0hQQFKUjIlVEkCZFmqD3/hPzfd77fSZOskk2ySbZJPv+4fMkn91kMnPOa05mzs6c89hjjwWqW8Q0QvbBKP9NnDgxUBm47Q+8PloDJeqD+iADZIAMkAEyQAbIABnwmwE64+iM8zwJffDBB00n+AgAPHbsWN2WDifgrly5UjRr1kxgS4WT69VrsFLN6MSR/3t1xs2aNcuyzGyccdjyIuumHhGvTW2T23OrODfYjuKkLMSLUeujnj/55JOOynDyHLNrsL1ZfZ56niRn3Jo1ayzbGaQzzk63tWvXDlS3ZvrmZxzMkAEyQAbIABkgA2SADJABMpDPDNAZR2ec54n4uHHjLB0LcKY0bdpU7Nu3z3P5bjrmzz//bFkXr8642bNnW5aZjTPu9ddfNy03W2dcw4YNTcu95557HOmgbt26pvdDl3379nVUhhudqdfu3LnT8tlJcsZhlZjqaFTPg3TGde/e3fK5CO6t6oLnHBSRATJABsgAGSADZIAMkAEyQAaCZYDOODrjPE/E4WhTnQlm54UKFRLPPfecOHTokOfnODECyAhp9nx85tUZ995771mWmY0zbtiwYablZuuMa9KkiWm5TpxxiNmHmHVWMsRqPid68HqNXcy/JDnjNmzYYCnjIJ1xdllcoXMvSUO86pr3BftSp3wpXzJABsgAGSADZIAMkAEyEH0G6IyjMy4rJwtWv1k5cNTP4ZRDTLigVsodPXrUsh5enXHvv/++ZZlJc8YhTp+qL+M5srAFadD37Nlj+fwkOeM2btxo2c4gnXGZVrEeOXIkUP0GyU5Uy4atmzBhgnj77bf5RxmQATJABsgAGSADZIAMkIEIMPDBBx+IixcvRmLuQ2ccnXFZgYhYbaVLl7Z0MBidOgUKFBBPPfWU2LVrV1bPNU7Af/vtN8s6eHXGzZ8/37LMpDnjzpw5Y9lW6HDo0KG+6suoP7sEHElyxtlljQ3SGYcEBca+qP7vd3806jff/scKSNg6VcY8/xfl8S/KgP2ADJABMkAGyAAZIAO5ZqBjx46Bzm2dzn3ojKMzLmsQ169fL5AJ1G2nateunfjhhx+yfj5gpzPufyKbbaonTpyw1d/w4cN90ZOVYaIz7l8iSGfc5MmTbfW7Y8eOQPVrpfekfm6X/MWtneT1HLCSATJABsgAGSADZIAMkAH/GIhKAjs64+iM82USjgQK9913n+2E38qAdOnSRWBlVjYTczrjsnPG2ckPehsyZEhW+smkWzrjgnXGTZs2zbZvbt++PVD9ZtJ/0r4/f/58agVwpUqVRMWKFflHGZABMkAGyAAZIANkgAyQgQgwUL9+ffHll19GYu5DZxydcb6B+Pfff6eSJRQtWtR24m/mlKtZs6bYsmWL57rYOZO4TTVzNtWTJ0/a6izomHF0xgXrjJsxY4atfpFAI2kOMbYn+kFrqSPqiAyQATJABsgAGSADZCBfGaAzjs443yfhCFzeoUMH28m/mUOucOHCAtu7vHRGOuOyWxmHlTxmOpGfDRw40JNenOqSzrhgnXFTp0611W9QiVWc6p/XcRBGBsgAGSADZIAMkAEyQAbIQD4xQGccnXGBOVm2bt0qWrVqZesEkM4e9bhs2TLXdaIzLjtnHIxeiRIlLHXVt29f1zpxY0jpjAvWGZcpgcOxY8cC1a8bFngtB2FkgAyQATJABsgAGSADZIAMJJ0BOuPojAt8Er5x40bx4IMPWjp6VEcczpGd9cCBA67qRWdc9s44bBU26kL+//TTT7vSh1vDSWdcsM64cePGWeq2ePHi4r///W9g+v3iiy/EM888E+m/119/PbD2u+0LvJ4DTzJABsgAGSADZIAMkAEykHwG6IyjMy60SejKlSvFjTfeaOkUkI4fHB944AFX9aIzLntnXOPGjS1106JFC1f6cPvyoDMuWGfcG2+8YanbW2+9NVDdvvXWW5bPVvt8Ls9vv/32QGXgtj/w+uQPvqhj6pgMkAEyQAbIABkgA/nNAJ1xdMaFOgm9ePGiGDp0qEB8uEyT7yNHjjiuG51x2TvjOnbsaKmTunXrOtaFl5cKnXHBOuN69OhhqVtsJfeiM6f30BmX34MMp5zwOnJCBsgAGSADZIAMkAEykE8M0BlHZ5zniTicav369fN0/549e8Rtt91m6SCAo+7tt992XDadcdk740aPHm2pj0qVKjnWhRcDSmdcsM64Rx991FK3vXv3DlS3dLrFdLkAACAASURBVMYla1B14cIF8eyzzwqspMXx+eef5x9lQAbIQOIY6Nmzp/jqq68CfT96GS9lc8/Vq1dFr169RMOGDUWXLl0SpzO+j/g+JgNkQDLQp08fgVBZ2djMMO6lM47OOM+QYiVVmTJlxN9//+2pjLNnz4r69etbOgnatGnjuFw647J3xi1fvtxSF4UKFQo0rhidccE64+68805L3SKeXJAvm0OHDokvv/wy0n/fffddoDIIUr5hl926dWtLljKtdub3/6Ls/kUZsB/Eh4GCBQu6jmEctk1287zu3bvTBtEGkQEykDcMIC72yZMnIz3GpzOOzjjPgMptjTt27PBcxokTJwQ6itngtHnz5o7LpTMue2ecnQyhn9OnTzvWh5vBIa6lMy5YZxxWNpr1MXy2du3awPTqlgNeH/1VdDVq1LBkyYoxfh4f5wN1RV2RAT0Du3fvTsw7sl69erTfdMSQATKQVwwcO3Ys0jaczjg64zwDKp1xffv29VwGJt9Wv9S5SRpg50iaNGmSp/rNnz/f0lgdPHjQU5lo77Bhw0zLxS+w2TgjmjRpYlruPffc47jcqlWrmpaBwTm2FmdTP7t76YwLzhmHbSlWkys4wi9fvhyYXu10zu+i73gz01GFChU0nuCYa9asGf8oAzJABhLHwEMPPSQ++OCDQHcFmNnYID+rXbu2Zr+rVKmSOJ3xfcT3MRkgA5KBhx9+WHz22WeRn+PQGUdnnGdIpTOuWLFiAivcvA4gsEXMzFmAoPNOyzx69KhpGSjXqzNu3rx5lmUeOHDAcd2MbUCsPbP2FihQwHOZeIZVNlQ46Yx1sPr/ueeeM60b6ottrFb3Zfs5HH1mMsFns2fP9vxcxLdatWpVyhhv27bNcznZtk/eb8U62ol6yuv8PCIRipVsW7ZsGcgz/aw/y4qO0+6PP/7QsYSJKvUTHf1QF9QFGSADVgwgpAzG63I84HVsbFU+Pyd7ZIAMkAH3DNAZR2ec58mUdMbhxT548GDP5VitanPjhPnll1+0AYYcaMjj2LFjPdXtnXfesSxz3759nsqEkXrttdcsy/Uafw/lNmjQwLTcRo0aOa7r0qVLTcuALIOMLbZr1y7L586YMcNx/eVL4NKlS+Lll18WJUuW1JWLVYKrV692XZ4sN9tjLpxxds90kyQl27bzfvcv6KjJbMuWLbr+FAUHd9RkxPrEn3PqkDpMIgPGcfLKlStzNhZKonzZJtoNMkAGvDBAZxydcZ5fxqozrkSJEuKnn37yVNavv/6qm+DB8XPNNdcIrOhxCvX27dvTypDOuFGjRjkuR33e5MmTLcvcunWrpzJR/quvvmpZbjZbBu+++27TcmvVquW4rlj5AtlL2alHZE5U5ePn+fr1602fiee7/fUW2zKxxVmtu/F8/PjxgbXFTi52jrGgVsbZOZV/+OGHnMjBTkb8LrqDmYULF+r6FewF9RVdfVE31A0ZIAOSAfwQqY6FkFxJfscjOSEDZIAM5IYBOuPojPP8MladcXjBIxbF+fPnXZc3d+5c3QABZXXr1s1VOdgTrg4y1PN+/fq5Kksao+HDh1uWmc0e9BdffNGy3N9//91TXVHnW265xbRcrA6TbXJyxNZFVX7yHM4+J/d7uWbBggWmz8SzEWPPTZmLFi2yLEu2BcclS5a4KtdNHayuzYUzrmfPnqbyQHzA//73v6HLwEo2/Dw3gwA3clfjXSLekJt7eW309UsdUUdkILkMTJkyRRsLFC1aVGSzE4OcJJcT6pa6JQPhMkBnHJ1xnidURmccHBzYBnjq1CnHZcIZULduXW2AgDIQINzNqjgYjREjRujKUJ0ud9xxh+P6qAYIbVHLUc/feustT2Wi/Pr161uW63V11NmzZ0XhwoUty3Ujzw8//NC0nCJFiogrV654brcqW+P5gAEDTJ8JmbtJQIFyEXRZ1ZXVefny5QVW0RnrEuT/uXDGYZuymQzQZ4JsK8sO92UehryfeOIJjaX777+f/HD8QAbIABmICQN9+vTR7HedOnWot5joLYx3O5+RvPEadRofndIZR2Ps+YVs5ozDpB8Z9jZt2pSxXPwqpw4OcC+2SGLLohsjgq1SFStW1AYZZo6HtWvXuipzw4YNtuVVr15dXLx40VWZaFOmVVtYlfbXX3+5Lvell16yra+bjLeIt1auXDnT8oKIEQXnbenSpU2fJ3W5efNmxzK56667bMuSZeLo1fnphk/12rCdcX/++acuYLNsOxy3UU/1rcqN59EYVNSrV0/rWy+88ILjPkn9RUN/1AP1QAbylwH1h8r27dvTfnP+RwbIABmIAAN0xkVACXEdHFk54+SEH1k8kZHU6LSCE+7rr78WrVq10iZ2uKds2bJizZo1jg0DnEZwbtitNJN1KVWqlEDsLDgg7LbmwbGHxBGoi7zX6ohtm2hHprhJWH2FeHpjxowR2BpgVZ78HFlREVj39OnTtrLAKjW0H7Hc5L12R6xqQaw7OGgyMWe1Ug3bHDLd6/R7cAHH6+23356x/nAOgiUnWXvbtm2bsTwpJ7fboZ22zeq6sJ1xGzduNJVFp06dfNOjVVv5ebImfbCb1157rcbThAkTyBDHD2SADJCBmDCAH8rl2AeJxPiOTtY7mvqkPslAPBmgMy4mL9EodrBMzjj50i9TpkxqqyGcb1j5Va1aNW1AIK959NFHhdNgskiAUKlSpbQyZFmZjnDMGeOfNW/eXKCehQoV8lQunEUY6Kh6+vjjj0XlypUFtndmqpPV93AKNmvWTFcuMtci3peaot7qfrPP0UbU68cff9SVq9YdujBL5AAdqtd5Oe/Vq1fGlYxm9ZafQU9Gmaj1WLx4sWN5u0luoT7D63nYzjhsp5ZyU4+oh9c28L54vuyz1Ru2uqsMLV++nAxx/EAGyAAZiAED+PFTtd+I1ZztO4H35+dYgHqn3smAvwzQGReDl2hUoYczDs4irA7DRA2Ts/79+wvEaFNf+lbnBQsWTDnn3G4VhLMFK7ey+TNmWEV2zWzKw71wEqq6wiq0bMvE/WPHjtWVCyefH+UePXpUV65ad5ybJZqAAxArEo3Xuvl//vz5WdffKBP1+Vh52aVLlzQGwSocgQg8L5mEU1O9N+hzO2ecm1WhTutpXH2Kdhsd0U7L4nX+vnzjJk/wKfsNjvv37w+178RNXqxvfvcX6p/6jxIDyJyu2m+smo9S/VgX9hcyQAbylQE64+iM8/xCPnPmjMCfWefB1k04o5Alc8iQIeK5554TnTt3Fl27dk1lx4RDjTGrom144WA1W9WHLbRmOo/SZ9hShy2wiKUHxxycrefOnUvVe9q0adqgFLH/wqy3nTPObazETPU+fvy46epGt87vTM/h99Hux37pZ/r06Vq/QcxBL7Et/aoLy8kP5qhn6pkM+MMAsserzrhMYVAod3/kTjlSjmSADGRigM44OuNCdUZkApLfR8tomSWGwOqyOOvpgw8+0AaliFcXZlvsnHG7du3ytS5mW1T92GYcprz4rOjYA9UW3Hrrrb6ySj1HR8/UBXVBBpLHwOjRo7VxDzLJU8fJ0zF1Sp2SgXgyQGccnXF8KZMBSwaw8tEYnw+ZTy9cuGB5T9RfBkhCIX8hDtuxaOeMy5QIxI1csTLwpptu0tqJ9iIG4J49e2KrNzft57X+D0gefvhhjac2bdqQI743yAAZIAMxYUAN3YHkanxH+v+OpEwpUzJABrwwQGdcTF6kXpTLe2gU/GDgk08+0Sbh0ok1Y8aM2A7mHnzwQa09mzZtCrUd3377rfZsKUsckQDED13JMhDHUS0f50OHDvX1GfJZPOaHnbnxxhs1pozxMclAfjBAPVPPZCCeDDRs2FCz388++yzHApz7kQEyQAYiwgCdcRFRBAc48Rzg5IvejJlzMTG/evVq7Aw54uAVKFAgNShFJlWsIAtTh4gLZ3SS4f969er5Wo9OnTrpnnPzzTdnnXgjTDnxWdGyh3/++afWb8Dr7NmzfeWV+o6WvqkP6oMMJIsBJLCSY48xY8bQfnPuRwbIABmICAN0xkVEERz4JGvgkzR9njhxQlSrVk0bzGFQ9/bbb8fOkI8YMUJrw7hx40KvvzEjpRwcd+/e3be6IHFD0aJFtXYWL15c7Ny507fyk8Y225PZ9u7evVvjCcxu2LCBPHHsQAbIABmIAQMnT57U2e+lS5dSbzHQG8cmmccmlBFllAQG6IyjQeZLmQw4YgDZcYsVK6YN6kqUKCEOHz7s6N4oGEskSJBOqgYNGogrV66EXvfVq1dr8pOOOBz9HBwbV8Uhc3EU5M86xHfQBD5VXjG5oz7jq0/qjrojA/nDAH48Ue03flyh/vNH/9Q1dU0Gos0AnXF0xPClTAYcM7Bw4ULdoK5t27aO783lywDOA5nQAPHZDh48mJN6L1++XCc/DJCRWMGv5A1ffvmlrvzXXnstJ+3Mpa75bP8HHW+++abGVZkyZULf3k2d+q9TypQyJQP5wQDCCkhnHMJ0XL58meMCjvvJABkgAxFhgM64iCiCg6L8GBQlQc9IBCAHdjhGPX4UHG933313qs7XXXedQEbTXOlh0aJFOtlBfo888ogv9UHm2+rVq2vlt2zZUvz111++lJ0refG50bCLCPgt+zwCgVMv0dAL9UA95BsDCJkxZ84cAZuEZEz333+/eOKJJ8Rbb70lfvzxR9omkzkNEu5I+414v/nGDNtLO0kGosMAbXi6LuiMM3lxsdOmg0KZUCaSASQ96N+/vza4K1KkiNi8eXPkBnh///23mDJlisB2WgxEb7nlFrF//37f6onyV61alXJGIjGDk2QQo0aN0uQmB8d+yA7P7tChg1Z206ZNxdmzZ31rq9Q9j/lpB5o0aaKx1aVLF3LFcQMZIAOhMoDV48OGDRMlS5bUbJF8h8ojVn21bt1aICQF31X/vKvatGmjyezhhx+mbNh3yQAZCJ0B2vB/bLLx/URnHDtk6B3SCCH/t+6gUZUNnD/YAikHwZUqVRKHDh2KBEtYDbZixQoBhxTqhwQGo0eP9jWbKBxdWCEk249j3bp1xZYtW2xl8PTTT+vu8WObL3QxePBgrVwMvC9dumRbj6hyxXpF0xaUL19e4wt9iXqKpp6oF+oliQwcPXpUPPTQQ5oNUt+7ZucVKlRIxWHFD2ZJlIfbNt16662a7F566SXKhPM+MkAGQmWANtx+bEJnHDtkqB3S7SCC19t34FzLR40lVbNmTbFv376c89SsWTNt4PnUU0+JX3/91fc69e3bV3uGOhlAgouPP/7Y9HkXL14UmCTI6/ELf7byguPxxRdf1Mrs1q2buHr1qunzc80Knx/tvmyln9OnT2t8gd0lS5bY8nX+/HnRuHFj/jmUwVdffWUrTyu98PN49ifqzZ3esJoCP1rJ9yaOhQsXFtdff72oWLGi7nP1mtKlSwvEaM13eWOMAHlJ2UyfPj2jTDCGog139g776KOPMsoz3xlk+93ZvKTJizY8s/7pjKMzji8SMpAVA+vWrUsNjDHYwwqaTZs2ZVVeti8irD6DkzAIJ5ysW7Vq1bTBrRzkqkfErzFuWx0xYoR2T6FChbKeKPz555+iY8eOWplYqWh8pqwvj5lfhpSRuYwQY1Fl+4cffrDt3xh4qdfz/F+28nAyOSab5mxSLsmWC1a2oX/gfQk7gvhwCA2Bd5/U/bFjxwTeraVKlUrrZ3Xq1BFHjhzRrpX35NPxwIEDOrmsWbMmozwQeoR2295uS/mMHDkyozzziTe2Ndk22a1+acOd8UBnHB0xfJGQgawZQPKAJ598MjWAQ4y2pP8iXbt27YyD1bvuukvgV9Ovv/5at3oNq+cWL16clczh8EDwagwIEZAZDlG3L0le7+wlme9ymjt3ro51rPC0kwkmylWqVNHdIycuPKZP8DiZYz+060/5/N3x48dFvXr1BJxDY8eO1TnhjHL59ttvRY0aNXR2BzHkxo0bJ/J5u6oxg7sT56S6rZU2O91mqzLBLgkji/yfNp0M/D8DtOHO+gKdcXTE8EVCBnxjYP78+akAyxgEDxkyJLFbJhGTTh2QOT3HIDeb4NJY+QYHX9WqVVPP79evn7hw4YJv+uMAwtmLM5/kpMaGxGTXSduRlKRo0aKe+ojTvpSU6/r06eNIpk7kzmvYf5PEwGeffZaK+YrEDU7CL2DVnDHBQ/PmzQV+vEqSXNy0ZcKECZodxg+lTlbP792713SlYVJsrp/tQCgUN/rgtbTR+cQAbbgz3umMoyOGLxIy4CsDv/zyi3jmmWdSA0BkXU3qiweOx2uvvVYb6NoN8BBPb+LEiVk7zlAGnoNVdxs3bkysbJPKTBzbpWbpRRB1p21YuHCho75h12/y4TtO5pwNVp1yx+uSIU/EOsMPAYhdduLECUd25/Lly6Jr1646u3PTTTfl9VZVNabsHXfc4UiO6EP4wRE/quaDDc6mjdihQJuTDJtDPfqrR9pw5/KkM46OGL5IyEAgDOzcuVO8//77gZQdlZfmb7/9Jt59913RuXNnccstt6S25yGzLLaOPvLIIwK/6GNQi5eSH3XGqjj8+u/k120/nscynL9MkyorxF2SkxW3q7jUVXWyDCdH9Cf0GWwvi8PflStXBBJdYEXgggULBH6EyBRXUsqhRYsWvtiGpPLHduWnDUJG8Pbt24tZs2a56h8IAaEmLECih4MHD7oqI0nMIc6etDVPPPGEKzm8/fbb2r2yDCfHhx9+WMAmxsF2o46o69mzZ8W2bdvEhx9+KAYNGiT+/e9/O2q7GwdnkrhiW/LTLrvRO224c0bojKMjxtXL2U1H5LXOOyJlRVmRATIQNQYwUVG3m06ZMsXV+wL3wyntZAJnvAYTwajJw0190Pb169engs4b26b+z8kc+70brvLpWmwvdftDFn4ELFu2rGZz8n1lnBq/Ez8OuuEHP/p16dJFk6VqtzKd44cYN8+K2rVoO35cad26tW37ETIkanVnffhOiQoDtOHOWKQzjs44vkjIABkgA2SADKQxcOjQId1EZPXq1WnXZBr0nTt3TtSqVUtXTqaJHL7HFimsKs1UftS/x6Ru0aJFOgeB2n5O5pwNVqOuZ9YvGnrcv3+/wOp02ceaNWuWtzHjMBGWcsARq3bdcorVLQ0bNtSVo5Zpd45QBW6fF8Xrv/jiC8ukRPixijsVotH3o8gO6+SejXy04XTGcQKWiJclDZ57g0eZUWZkgAzYMbBy5UrdJAzxIO2ut/pu3759okyZMrqy7CZx8rvSpUsLBBO3KjdOn+/Zs8d0QsfJHPtgnDiOel2RIEldGTdgwADXq+ui3kan9cO2S2lLcdyyZYsnW4pwHOoKO7VMu3PYNq/PdNrGsK47fPiw5dbVfE4QEpb8+Zz8eU/mow2nM47OOE8vZxrG/DGM1DV1TQbyk4FJkyZpk7lixYqlYgB5ZQGr6goWLKiVZzeJU7+7+eabU/F8vD43Svft3r1bQI5q+3DOyVx+9q8osZmUumAVU/HixVN9DAmW1q5dm7djXMQ/U21NNnbGa4ZsOPHgzEsCX/gxyuxHpZ9//jkR7UuCjtiG+L9L89GG0xlHZxxfImSADJABMkAG0hjo3bu3Npm7/fbb0753O/BVnXvqJDHTOQKCu40d5bZuYV3/5ptvajKV7eZkLv4TiLD44XOsWUGcxhEjRmj9C9mfs3FAxV3Wb7zxhiYLbN3Ntj3Y5iptlptjo0aNBDLdZvv8KNw/e/bsNBls2rQpEW2LgnxZB2v7lg+yyVcbTmccJ2B8iZABMkAGyAAZSGMAmT7lpKtjx45p37sdHCK2Trdu3bQyZdlOjgMHDsz6+W7rG8T1V69eFXBsqm3mZC6/JyBBcJaPZZ45c0bcc889qb6F1XGff/55ImyGV10+9dRTmp1B7Dyv5aj3IdOoarucnj/77LOJiK2GdxhkqbZ7+fLlvshWlTPP+U7IRwby1YbTGccJGF8iZIAMkAEyQAbSGKhevbo26Rg8eHDa914Gi1gh0bhxY61cdVKT6Xz+/Pm+1MFLvf28Z86cObr2czLHiZeffOVrWehHcovq008/LS5cuJAIe+FVn3fddZdmZ7p37+6LLLBCuVWrVlq5mWy2+v3EiRN9qYNXefh137Jly3Ttnzt3biLa5Zd8WA7fZ14ZyFcbTmccJ2B8iZABMkAGyAAZ0DFw8eJF3YRj3rx5uu+9DrZw37FjxwSyiKoTNSfnRYoUEUlYRXb+/HlRsmRJrf2czHHykk1/4r3/S21Hfeyxx1J9qkaNGgJBwPNZLljBhZh50q6OHz/eN3lkkyF71apVvtUjV/qFQ1J9f/kp21y1ic/lOyjXDCCkQL7acDrjOAGL/Ysx1waEz+dLjAyQgaQxsGPHDm0ihwnd999/7+u7YuvWrabJDOTk0epYuXLlRAQEx0oV2UZO5mg/kmY/wm7PokWLBLJ3wmFP5/b/UjZS2hccsZrLT514zZCNBAi418+65KKs119/XbPf2LqbizrwmXxvJImBfLbhdMbRGceXCBkgA2SADJABHQOLFy/WJhuYzCGWh98DPwy+1Amj0/MGDRqIS5cu+V4fv9tnV54qX07mOKmyY4Xf2fOBLJe1a9dO2ZKXXnopMckCstH7unXrdLY1CAeY1wzZtWrVElhdl037cn0vsvTK99Vzzz0X67bkWpZ8vr19ywf55LsNpzOOEzC+RMgAGSADZIAM6BgYNWqUNtmoUKGC7js/B4fqCgM5uXFy7NKlS6wDgh89elSTLydznIz42afyqSw45WVSGMQyO336dGC2Kk5ynTlzpmZfrrnmGoHEMUHUH3HgnNhr4zXQVZwzZCMeYaFChVJtx9a6IGTLMvleyAcGaMP/J+iM4wSMLxEyQAbIABkgAzoGOnfurE2ykKEwqEEhUtnLOCHGCVum/+O+vfOGG27gZI79LrC+FVSfjUq5sB1Tp04VcDYhWQFWV0SlbrmuR79+/TT7fcsttwQmF8SmQ6bUTLba7Pu4rwi+++67U+1u0qRJYPLNNUd8Ph2CQTJAG/7/fNEZx4EgXyJkgAyQATJABnQMYCuonEAFvXILgXtvu+027XnyuZmOBQoUECtWrNDVO8iBo99lt2vXjpM59rvY8ut3f3BbHjLvlS5dWtx8883ixx9/pByVvvTII49o9rR169aByiabDNkLFy4MtG5umXJzvYz7edNNN8W2DW7ay2vpmPObAdpwOuNoPJUXt98djOXRaJMBMkAG4skAVjtgkiudYW+99Vbg78sDBw6IsmXLas+Uz850LFWqlNi7d2/g9QuC5f79+6fay8lcPPtJEEywTGcsbNmyRVSvXl1Uq1YtERmW/db7v//9b82WDhgwIHD76DVDNpJubN68OfD6+S1flDdmzJiUjJGUIojyWaYzW0A5xVNOtOH/6I0r4+iQ4kuEDJABMkAGyIDGwIkTJ7SJHJxhn376qfZdkAPfr776ShQsWFD37EzOOHyPlTFnz54NpY5+th8rAn/77Tdx/Pjx2NXdTzmwrH8G5ZRFZlnA+Y6EDRUrVhQIpE+Z6WV25coVnR199913Q5GR1wzZVapUiWWGbMSNg/3GHxnUM0h5UB52DNCG6/mgM44TML5EyAAZIANkgAxoDKxfv17nEPvpp5+07+wGWH58N2XKFN2znTjjcE3Lli1jHRDcD9mxDP0Al/JInjwOHToksIUeq5E+//zz0OxSnFjas2ePzobCnodV/w8//FD3bKf2u1GjRsyCyzFIaJyG1R/4nPR3EG14ukzojKPxo/EjA2SADJABMqAxgJUUchKFlWp//vmn9l3Qg0tskZWxeGQdnB4HDhwYWj2DlgPLTx+wUib5LRNkIG7atKm49tprxaJFiwSCf5OJdCawklm1mWGvvPWaIbtr166xzpBNFtNZpEwoE5UB2nBzHuiM4wSMgxkyQAbIABkgAxoDcGrJyRxiD6mDqTDO4fxDBldZBzfH999/P/T6hiETPsN8EEu55IdcMIlr1qyZKF68uJgzZ45jRxwcdtOmTRMdO3YU58+fzwvbMHbsWM12IqYmfuAIs59A5kga4cZuy2snTJgQal3DlAuflR+2ino21zNtuLlcwAudcZyA8cVHBsgAGSADZEBj4LHHHtMmUq1atdI+D3OQidUcCM4uJ2lOj0WKFGFAd7KcE2bD7B/59KwjR46Ie++9VxQrVkzMmjXLsSMOWT4nTZok4JCaPn163jCB7NfSXtavXz8n7T537pznDNkrV67MSZ3zqU+xrdaOEcrGf9nQhtvLlM44Dlr50iMDZIAMkAEyoDFwyy23aJO5fv36aZ+HPUjdtm1baiWMnFg6PVauXJlBtclzzrgNu58k+Xk///yzQDwx9P0777xTYNXuoEGDLP/wfe/evUWHDh0E7ADuq1q1amwzLnvRrbqquHPnzjnrB/v37/eUIRuZvPft25ezenuROe+xdzZQPvkrH9rwzLqnM44DVr7wyAAZIANkgAykGLh69aq45pprNGfczJkzc8rG4sWLtbo4dcbhOgR5v3TpUk7rzglI5kEoZUQZWTGAjHv16tXz1P9VW/HUU0/lVXIAZJmV7R85cmRObaDXDNm1atWKZYZsK5b5Oe1cPjJAG+6MezrjOAHL6Ys6H40T2+zMOFFOlBMZCJ8BrEiQEzkc165dm/N3xNChQ3V1Uutnd/7MM8+EHi+JzIbPLGWePJljVezNN9/sqd+rNqFw4cKpZA/5wsjZs2d1MsOPGblu++TJk3V1UvVjd44QCX/99VfO659r+fH5ybNv+aBT2nDn3NIZR2ccX3RkgAyQATJABlIMLFu2TDdx+u2333LOBgKCt23bVlcvu0mc+t348eNzXv98GHizjc4H3pSVvayQwMVrf1f7Ps6x5R7xivJF5ps2bdLZyR07duS87Ugg8fzzz+vqZdST1f/YkpwvumM77e0C5RMf+dCGu9MVnXGcgPFFRwbIABkg77PHZwAAIABJREFUA2QgxcDbb7+tTZquvfbayKws++OPP0SdOnW0ullN3oyfFyhQQKxYsYJ8k28yQAYSzwCySas28MKFC5FoczYZshcsWBCJNtAZ5M7BQHlRXmTAGQN0xnFwwpccGSADZIAMkIEUAz169NAmcwiYHqXB1MGDB0W5cuW0+qmTTrtzZFNE7JIotYV1cTZIpZwoJzLgnIHBgwdr9hHZqKMkO68ZsosWLSo2b94cqbZESa6si/P+QVlRVlFkgM44TsD4giMDZIAMkAEykGLgvvvu0yZzCHwetYELYtgVKlRIq6OdE079DvGnEE8pau1hfTg5IANkwC8GOnbsqNnGBx54IHL2zmuG7CpVqjBDNscokePZr37LcvL7HUBnHI0bjRsZIANkgAyQgRQDlStX1iZzb7zxRiS5mD59ulZH1eGW6bxly5YMCE7OI8k0J2P5PRnzS/9169bVbGOvXr0iybrXDNkNGzbMq6y4fjHBcmhbyEC0GaAzjgPTSL6saTiibTioH+qHDCSPAcRlUx1aH3zwQWTfDy+88IKurmq97c4HDBgQ2TaxTyWvT1Gn1GlYDCDRTbFixTS7OGnSpMjauiFDhmj1tLPXxu+6du0amTimYemVz6ENIQPJZoDOODrjIvuypvFJtvGhfqlfMhAtBrZu3aqbIGFLUVR1hIDg9957r66+xomb1f8Ich7VdrFe0eoT1Af1ERcGDh8+rLOHUU5cA8dhmzZtdPW1stfGzydMmED7zbkrGSADiWGAzjjCnBiY4zJgYj05uCcDZCCKDCxcuFA3OcJKuSjWU9bpxIkTokaNGro6GyduZv8XKVJEfP/995Fum2wjj/GzFXA07N69W8yaNUvs37/fN86+++470b9/f09l/ve//xXr1q0Tr732msD28z179vhWLzIaDUZXr16ts4U///xzpHWcTYbslStXRrpt7BPR6BNe9ABbuW/fPjF79myxc+dO3zj74YcfUvZ7+/btnsrEmAUrSvHntQwv8uA9wbNMZxydcZ6MAjtn8J2TMqaMyQAZCJOBYcOGaZM5BMwO89len7Vjxw5RokQJrd5mzjezzxAb7+jRo7Foo1fZ8L5w7Mfly5fFhg0bxJtvvikeffRRUbZsWY1HTJz80ANWgiIJCVj+6KOPXJfZp08frU6yP/znP/9xXY4fbWEZwXA5ZcoUTcf4wQFO4ajL2muG7NKlS6ccJlFvH+sXDOt+yvXKlSupH+fGjx8v2rVrJypUqKD1oxdffNGXPoS+iJiHsL0zZsxwXeaIESO0Okn7jR9m4Dj0UxYsKze80hlHZxw7MhkgA2SADJAB8eSTT2oDvvvvvz82TMA5IQeobo7169cXly5dik07OVDOzUDZKPfff/9dfP7552LQoEHinnvuEXB8WHF3xx13+MLX6NGjtWdMnTrVVZlYBWdVv40bN7oqyygL/h8NJqEH1eFau3bt2OjVa4bsW265hRmyOW5xzfm5c+cEtnAPHjxYIHu8GmfRaCfxo6QfDq933nlHs8HDhw93VefffvvNMoM83kO0wdGxwV51QWccDRk7MhkgA2SADJABUa9ePW3AiAQJXgcWubgPW++MA2kn/3fu3NmXwXYu2sxnhj8IN8blysRYgQIFBCZ/2ejq0KFDugmj29V2y5Yts+wbPXv2zKpu2bSL9/rL70MPPaTpuX379rHS67Rp07S6Z+pT6vetWrVihmyOXRyzfv78eQGbrDKU6Tzb7d6nTp0S5cqV057pdrUdtqda1bFjx46O205766+99VOedMbRiLEjkwEyQAbIQJ4zgF9/r732Wm3QF7cg2dgG0qFDB63+VoNXs8/HjRtH/vOcf6cD6zNnzghkqcRqTKyu+PTTT8XAgQNFpUqVLNnLNr6VMdB99+7dXfGK7diFCxc2rR+SoDhtO6+L7mQOurnhhhs0HSM2YNz05TVD9quvvhq7tsZNN0mpL7b7T5w4USxevFgsX748tcIZP27YxZ6dP39+Vnw9//zzWr/E+KNt27auysOPOaVKldKVIccxt912m6uykqLHpLWDzjgOQNmRyQAZIANkIM8ZwIRdDvBwxEA1bgMe/Opdt25dXTvUNlmd45fyOLY3bvpJcn2PHz8ubrzxRlP23K5kU+VktqqtdevWrvvm9OnTTevWvHlz12Wp9eN5NBx02G6v2rf33nsvdnqFo6Rp06a6dqhtsjtfsGBB7NrLvhONvgM9nD17ViCkgBlj2ewSQBgAY5mNGjVyzeqiRYtMt6pivEOOosORV13QGZfnEzCv4PC++Hd+6pA6JANkQDKwZs0a3aDRzyyQ8hlhHLGlr3z58rq2GAfDZv/jl2dmmGR/yIZRrKAwY+vBBx/0NGG6ePGibrWTLLtBgwaeyvv6669F9erVdXV0u0ojG/nw3uD6FzI1Sj5wjGssQGTINjKqtsvqvGjRomLz5s2e+gW5DI7LOMkWK53N+PIa9/Ovv/4ydfDVrFnTE6dbtmwRtWrV0tURMUvjJGPW1byv0RlHZxw7MhkgA2SADOQ5A8jwJQei2NKGgWRcB07r1683/RVZts/qiGyV2IYY13az3uYD3bDkcuHCBd1Wb8kZtg96qcPQoUO1PinLwhHOCi/l4R44q9Utq8jS57Us3pdb3lT5G5PYIMmI+n2czr1myEawfQS7j1NbWdfo9CGMeZBlXbW1OEf4Di9JHCZPnpxWFsorXry4Z0YRfw6ZhGUdkbSFDEWHIa+6oDMuzydgXsHhffHv/NQhdUgGyIBk4OWXX9YGeLfeemvsB3gzZ87U2iMHrk6OLVu2jLUjUuqTx9z0bSQEMXKGbdDYgudGJ/v27bPM0opVQF4mh/L5TZo00er43XffuaqXLIPH3PBlJXc12+51110Xe50anYvGPmX1f8OGDZkhm/Naz/yr4yCVsWPHjrkqE9dbxXlDuX/88Yer8tR+r8YQRRgD9TueR8suO9UHnXE0WuzIZIAMkAEykOcMPPzww9oEHYM9p4OIKF/Xq1cvrU3qwDrT+YABAxLR/ijrJql1Q3IHM7727t3rmCk42uAURjkFCxY0LQ8xjrzK8M4770yV+e9//zsrp57X5/M+/yeMXbp00TiBszUJMh4+fLjWJrM+ZfVZ165dyXWej2e88o/Yg2ZcbdiwwVWfkj/KWNlv/NjitY7y3VChQgXXP/J4fSbv899mqzKlM44Gy7NBUEHiebAdlfKlfMkAGQiSAUzM5SA0Kdnprly5Iu677z6tXbJ9To67d+/mu5HjI9cMrF692pQ3NysY5KogZGjt0aOHaXle4xtiG1+hQoVSZY4fP951+4K0QSzb+zsOQeGlXXv22WcToVdkyG7fvr3WLtk+J0eEKiBP3nnKV9lt377dlLc5c+Y45mndunWpMkqWLCmsVtq5de5JfWBFncx6H8eMybIdPOr7Jp1xHGw6NjDsPPrOQ3lQHmSADCSBAWyhU3/BnT17dmLeC4ixgphdTiZw8pp+/folpv1J4DNObThw4IApaxMnTnTEFCZbVatWTZXx/vvvCzjMJJfqEckYvMhFbmdEbCQkiPBSBu+J3nuvbNmyGidjxoxJjF69ZMjGqqRstnGT7+jxHZZOYH9VOyvPX3/9dUd9Cj8A3nbbbakyJkyYIObOnWta3pIlSxyVZ2z3O++8kyoPW2DjHBfS2K58/5/OODrjPBmEfO84bH/+vqype+o+aQxgFZgcdOLo9VfbqMoFmQblr8lqO83OW7RoIa5evcr3IsdGnhjAZAwx4oxs9e7d21F5AwcOTN2LLHlwKFhtm1q0aJGj8tQ+iZVG0jGNhC3qdzyP73sNPziovC1dujRRukXSEcTBU9todX733XfTyUzbnRX/5cqVS2Pt8ccfd1Tm2LFjU/fWrl07NY5YuXJlWllgd+rUqY7KU+0y3gcyxMCoUaNc36+WxfNo2Xs642i02KHJABkgA2Qgjxn45JNPdAPGkydPJo4HYxvNJnM1a9bkr8153A/8mqBUq1ZN15/AGuL8ZCr/xx9/TG0hxSpVZJTE9V999VVaWSgPsekylWf8Xq7SwJZ0OA2N3/P/aE3QnOrjm2++0TECjpzeG5frsBJUbq82s934rGLFiuLXX39NXNvjoqOk1FM6vFTO8Fmm9oG9EiVKpPqiXLkMO66WI8+HDBmSsTzj87744otUWYgVl00CCGO5/D/3dp/OOA48XRsEdtzcd1zqgDogA2TALwbefPNNbcBYpkyZxG7xwa/JcjBsPGIQjRV0fsmU5eRv/7z33nvTOMPWJTsmsOqhWbNmqfv69OmjXQvHipFV/O82XtCFCxdElSpVUmUtXLhQK9+uTvwuHgwjrIBkBKsyL1++nEj92mXIvuaaawSckmQ2HsxGWU8dOnTQ+pPsV3CAZapzx44dU/c99dRT2rXHjx9PKwtldu/eXbsmU7n4Hqv1keUe93r5IcbJM3hN7voOnXF0xrkyCOysueuslD1lTwbIQBAMdOvWTRswNmzYMLHvBDg86tatq7VVDrRx/PjjjxPb7iCYYZnWtkjNbCkZgyPMTmbz589PcYlJ35kzZ7RrERdIlqEe3QbpR8wj3A9HIfqBXV34nbVuoyibQYMGaYxgdW8U6+hXnZo3b661Ve0Ps2bNSnS7/ZIfy8nct1955ZU0xgoXLmxrN+V2VITDOHr0qMbiX3/9pYvHK5lt3bq1do0TnSDmKO69/fbbuao5gX4bOuMSqFQnHZvXZDbIlBFlRAbIQD4wgPhUcpAIR0JS2zxv3jytnbK9OA4bNiyxbU6qLqPcrv79+6dxVrx4cUvGzp49m9piBxaNWfvgOMOqH5VXnLdq1cqyPKNs9u7dKzCZRDk//fST4/uM5fD/aL4P27Ztq/HhZDt0XPUot+kZ+0LPnj3JNOeyvjGABChGxvA/Vheb9R2sRJXZ6BEzzngNsmIby6tfv37adcb75P/IgC1j3m7cuNHxffJ+HqNpt1W90BlHA8aOTQbIABkgA3nMQPny5bXBIrItqoOEpJxv3rxZFClSRGunHBy3adNGILB9UtrJduR+4D1y5Mg0zsAbshab6QfbUvF9o0aNTFm8/vrr08pzEsMIz4Iz74EHHkjdT6dz7tkw03+2n8nta2DopZdeMmUs22fk+n44lJFBUtpteWzatClXCuXx2CUILpHcRvKlHtUVb+pzpb2vVauWKYt33HFHWnnVq1d33E+ffPLJ1P29evVyfI9aP55H3+7TGUcjxs5NBsgAGSADecrA6dOndQPFJUuWJI6FY8eOiapVq+raiUE24ngxEHL0B6pxm0xMnjw5jTXwBg6Nbdm2bVsq+ypifeHc+D3+xyoKdVKIc/Bsdq3xM5mNFdubrJyBxnv4f3z6BLbBYdWj5GPatGmOuIiTjs+dOyfg6JBtlEckSkFMrji1hXWNft/68MMP01gDc7t27Upj7eDBg6Jo0aKp65Fsx0y/Dz/8cFp5+GHQSbiAFStWpO7F9nOOVaLPjpn+nXxGZ1yeTsCcwMFrktvxqVvqlgyQATDw3Xff6QaKSUtiAAeEug1XTuRKly4t9u3bZzp4Zt9g38iGARn/TbImj3v27NHxhhWZiNGI7+222iG+kCxDHrHlNNNkDhPFkiVLpmIWbd26VffsbNrHe6PTPw4cOKBjw8ohEFedoY+Y8V+sWDFL53Vc28p6R6Nfyfhv0tbK44YNG9Js6COPPJLqf0jeYKU/xPeUZahHhCewugefw9GMDMG4R2Zntbue30WDHy96oDOOzjhbY+AFKt4TX4NA3VF3ZCC/GJg7d65uoHjx4sVEvRPg5FAHwDjHKiQMuMl6frEelr6XLVuWxhy4M8b7effdd1PXXXfddQIrVK3qh8x7RobxP5I7WN1z5coVzdE3ePBgy+us7ufn8egby5cv17Fx5MiRROkaW6vN2GdG4HjwGUc78v3335sy9/nnn+v61qeffpq6DpnYf/31V913aruR+dqMYeOPM+o9cEIj/iPu69u3r2XZ6j08j2+foDOOzjh2cjJABsgAGchTBmSWRQz6atSokSgO3nnnHdNB8Lhx4xLVTg7CozUI/+abb0y5W716tcbdqVOnRLly5VLXwSlnp8OhQ4ealvfjjz9a3icngA0aNDCNY2T3PH4XLZ7s9CGzLMJ+wymQabWkXVlR+27p0qWm3L/66quW3EetDaxPfPqS1BVWzJs5z1QHMJI5IO4brkPCB3mv2XHSpEmm5dmtdnv77bdT9yAxhFXiCLNn8bP48Qad0RmXpxMwdth4dljqjXojA2TATwY6dOigDRQfeugh20Gln88Nuqxvv/1WF0tJDq47deqUqAlr0HJk+e7tDZxkkjf1+PHHH2v9S652Qzy4TAlEEAdMLUeeW21JxOe4Bhn4sI2ROnSvw7jI7MUXX9TYQKD4uNQ7Uz3Rh2QGSck7jlgthDh5me7n98llPmjdnjhxQutTKnuzZs3SuJM/Yt50000ZY3EuXrzYtLxFixZp5altQkgBhCHACn78sKN+x/Nkck1nHJ1x7OhkgAyQATIQUQYQwBfxSJAlL4gAvgjsLgecyOqYhMEesp5VqlRJa5dsHzJQJm0bbhL0lbQ2gD/JnHqcN29eqn+pcRqR5TdT++HEU8uR5+pKDVnGyZMnNfaRvEF+zmNuJnGIM/XEE0+IHj16CKyG9FsPzZs319jAc/wuPxflnTlzRmBFkORcHvEZvstFnfjM3PSfXMgdW/wlc+px/PjxKfawvVQmTXES7mL9+vWm5WHFnLF9GONJ9gcOHJj2vfF6/p8MLumMi+gEjB0sGR2MeqQeyQAZ8MIAtibce++9ukEcYks5mbw7fR5W5CAQthxwTpkyJfaDv8uXL2uxsmS7cKxQoYI4fPhw7NvnVLe8Lnd2Bw5flT15jhVuWNVTr1691PdYHedET1jlKctQj9jKpN6PLYoyoPgzzzyj+069jufBs4HEMcbEA1jpZbWa0atO1CzR2M7stZyo3If+IWNlqaxDdrt37459+6IiZ9bD3gZgy7fKH87feOON1Kr6Bx54IPVdu3btHPFote0VoQSMeujatWuqbCSdglPQ+D3/t9dbXOVDZxydcezsZIAMkAEyEBEGMKHGihY4j4yDQfyPrUiZtrU5HZAcOnRI94xVq1bFmgPIrlu3bro2QWbY8oFfp53Khdclc8Abll7BoVw5ofbh0aNHCzi88VnZsmUdr5RCVlS1HHlujJ0lYxNhZUUQq2jDkl+cnwPdf/bZZ1o8KakrebzhhhsEfjDwo43nz5/XcZGElZCDBg3StUnKDTL1Q2Ysg7bdCQNVqlRJ4xC7E7C1FEziR8xffvnFEZOwxZJj9Ygsq2pdsNIZ32NV/2+//ab7Tr2O58ljmM64iEzA2LmS17moU+qUDJABNwwgi1ejRo1MB27qIA7b3NyUa3UtnG9quU4Hl1bl5frzqVOn6toj2zZjxgxf5JXr9vH58bEnZs50bCMsVapUilE3TGKVrGRZPXbp0kXjGs5mOJ3hBNy0aZP2eZSYgRNq8uTJqR8UsLokaQ7ynTt3CrlqRtWT8dyYldGrjrZt26bjws9V017rlM190tFhlNfIkSMjyXM2beW90bblt912m65vgclHH31UVK5cOfX5qFGjHDMJB33x4sXTymvVqpVWxvbt21MJWAoWLBhpu4iVvdga37Bhw9SPxozf6A/HdMbRGacZA74c/OlUlCPlSAbIgBsGjhw5Ijp37pw2WDNOSuT/xhUxbp6lXouJsSwTv/T6teJOfUZY58hMVqhQIa09sl2I1RRWHfgc9nvJwM0335zGomQSsQvdTmJKliyZVp5MuIKVc9jCjvKRQVjWIWpHOFvUFYNYwYfVuVGrp9v6IOA7Eikg4LrUsd3RuCLG7fPk9R9++KHueefOnYutLOGMMHNYIMEQnBmyzTzSxobBALaJWvVh2C23q1tr1qyZVh7eA2jLsWPHRLVq1VLfy7h0YbTR7TOQVEXdFo+t42qGcLfl8fp/+jKdcXTG8SVHBsgAGSADOWAAK14Qh8RsElKuXLm0wZscHGIw6McEpXfv3tozkMghroMjxIIrX7681hYpJwyoEbspru1ivf8ZrMZNFg0aNEjjUXK5ceNG10wia5+8Xx6xZR1boGrXrp367vnnn3ddblhyhaMfMc1k3XGEgzHOq+NgWzB5lqsd1baVKVNG11b1O9j2q1evZq0rvDtkudjaFpYu/X4OElvUqFFDa4tsU506dbjdOgfjEr/1G8fyZOxNyaJ6/OKLL1z3tcaNG6fxDccWnHryu6g7nj/55BNRtGhRXTuMcUvjqOso1JnOOBo610YlCuCyDvGdpFB31B0Z+F9qEnr99dfrBjYY8GGwM3jwYIFVDogvpA4C1fNdu3ZlbbsffPBBrXxkbI2jXhAsH78wq7LBOQa6+MU5jm1ineNvI++77740JsGl11VRTZs2TSsPW2HlpBHbhtyu1gibs2XLlqW2Ysm+Wrdu3djGRsIWUfwoItsij1idi9hSp0+fFvXr10/7Xl63du3arG3T008/rZWPZD9h69OP58EpqWaElfJBTEWs+PTjGSwj/vY0bB1iPCRZVI9IyuKlLkj2oJaDc4QVQKIdnN96662pMZ+XssO6BwlUuDIumL5EZxydcZ4MS1idn88JpuNTrpQrGcgdA3Agydgj6gANMaXUbVv9+/dPG8DJ60eMGJG17a5evbpWPhyAcWMCqwM7deqktUHKBg7NLVu2xK49cZM/62ttQ7CFVPIoj6VLlxbY0uhFblaTQ5SNYONxCPiNrbkfffRRyoEIpyS2PXmRRa7vgd0x24YMx+iePXu0No0ZMyaNAclCnz59tOu8tueuu+7Syneamdfrs4K6r1+/flobpGwQN+vLL7/MWj5B1ZnlWtu9pMjGalzh1UHcs2fPNM4l71hFu3///ljwjphxLVq0EE2aNGHMOB/9R3TG+SjMpBghtiP5LxrqmDomA7ljAFu21K1NmFRt2LAhbTCGz+SAzXjEFrVsdAiHoFrmvHnzsiovm7p4vRdbJNQ2yPP58+fHri1eZcD7cteP7WSPYN+SR3lEJlW7e+y+g/NGlqMe4XiOe+B+u3ZH9Ts1BhSCva9cuTJNt3v37jXVGfSHFSbZhBrAvWocwSjHmrLSId45KsvyfOLEiWmytCqDn0fT/sVdL/ixQPIoj8OHD/fMJX48leWoRzqeyS/6Cp1xdMZ5Ni5xN7asP40gGSADuWJg69atom/fvgJBuK0SJ+BzxAJSB2/quddfadFmZP5Ty0Im11zJwstzETjYLGD6K6+8Eqt2eGk774m+3TJuS4Lz3G3SBlXPo0eP1vVX2XcXLlxI3nMwjscKOGxHnTNnjm38N7OsjFJ32WS9xUpIWQ6OfmVoVZkL8hwO5CJFiujagHYgQ3A2Tsog68yyo293/dIREj+p/QshQ/ADptfyZ82apStPlj1p0iTPZXqtC++LHsd0xuXgJc6OEL2OQJ1QJ2SADESRAeOgUA7icMwmeO7ixYt1g8MzZ87EZlAIJyRiCqmywDli4GXj8Iii/lmneNolbDlX+fzmm2+y6l+zZ8/WlYeyBw0alFWZZCt4trD9X+VAPX/ttdc862/dunW6cvft2+e5rLA5QCxPNfaUlAli7F26dCk27Qhbbnxe8P1Vyti4Evmzzz7LikvcLzmXx+eee46OZ/pgUlzRGUcQsjIw0nDxGN5LgrKmrMlA/jCA7U9y8GY8IluoVxbUlTYIBO+1nLDvO3/+vEDmV6MsEEwdQdPDrg+flz990Y2uZWBucIrVPm7uNbt2+fLlOuaReY+O5+izh0QPRlsl/0fcOTNdO/lMXWmDpBFXrlzxXJaT5/l1DeqJ95aUgTxiBfjRo0dj0Qa/ZMFyott/1Xi9rVq1yppLrIKVrOP4wAMPMNM7/S8aV3TGEQYNBr4YovtioG6oGzKQnwz8+eefuvhy6oAO514zhqrOgmycemFyie1LZoHsr732WuFHdtkw28JnJbs/Y9UD+ifienntoyojqlMHAbT9zJz6888/C6zSQlZLBBp34hTBNkms9kNcS0w04SRX66ueo66o/9y5c8WAAQNSGWXVRDXqtUk7h81SE+UY7TcyFHpps+osyMap5+XZ2dzTq1cvnVMC8ihcuLD49ttvPckhm7rw3mTb4Gz0C3so2fRj1enhw4c17rEC9I8//vCN96DtN+SIHzrXrFkjxo0bl7LfcdsWnw0LYdxLZxydcb4ZhDCA5TP48iQDZCDfGDDL7CUndTNnzvRkwxs0aKANDrt16+apjLD1YJWd8JNPPolF/cOWF5+XO1uJeGLFixcXfsUEgvML5SGLnV8TOTj6sdUdzmxpT3Ds3bu37ao73IfVfvIerEr95ZdftD6IrYYoF9vGzbYjNmzYUPz+++/a9Unn9OWXX9ZkJWUmj6NGjfIkB2RulWW0bt3aUxlhy/3dd9/V6izrjiO2YIddFz4vd7YxDrJHv4S9HTp0qC9swmaivLp164pTp075VmYQ9hv6QUxHxN/FDzTYOaH2VyQfyzbsQhwYCLOOdMbRGeeLUQgTWj6LL1EyQAbyiYGPPvpINxhSB0YtW7Z0bcOxWqN06dJamW+99ZbrMsKWv3GbnpRBNhnOwm4Dn0e7FRUG4DDr16+fQDbWYsWKabYA/ap9+/a2W6iOHDkisBpL9sHHH39ct1IPK+GWLl0q4CTHn+r4xz14bj5tsV2/fr0mKykzebzzzjs92d6bbrpJKzMOSWs2btyYWgEn2y2PcPxGpU+wHrTPcWEgSPsNGWCl6jvvvCOmTZsmjEloYLNOnDjBfuuj/4jOOB+FGZdOzHryhUMGyAAZiA8D2AJmnDDLycw111wjzp4962pghIGUvB/HTz/91NX9YbODbSL4NVatM87btm1rmYk27Dryec77E3jFSi9sh3T65yTByIULFzKWi+e67S9J0y0cYVj5cddddwn5BwbnAAAgAElEQVRsk4TDDE452b+wksvOWYZg5PL6ggULihkzZtjaDzj7ZdnIoPnxxx/bXp9EeRtXl0h54Oh2yy7iriFOnCwDk+Yoywx93CwreLNmzWIT6y7K8g27brTfzt91QegmbPuNH0Kxqk/am0wrp4Noc9LLpDOOzrhIv8ST3gHZvty+1Ch/yj8uDLRp00YbDMlBkTwuWLDAlR03rtT46aefXN0fpsywJa9WrVppbcevtX5t1wuzPfn+LGzX6du3ryhTpkyaTiXP6hHOm5o1a6a2e/7999+WnOI7bAktV66cZblwaGNFEbbF2ZWVdB0tW7ZM1KlTJxXrDW2dOnWqKFCgQEpucPLMmTPHUs6YCKqZBq+77jqxY8cOy+uvXr0qsA1e6rRGjRoC2ZCTLmNj+55//nlNBlIW8jhx4kRX8ti7d6+uLNhz4/Oi8j9WSWJbsmyrPCKOHlfXxG/8Rfude52Fab9hR9577z3N+Y/4josXL46svYmK3XNbDzrj6IxjpyIDZIAMkIGIMzBv3ry0CY2c2GBbmZuXP5wR8l6sbMEA2839YV0Lh4mZExKOnP3790eyzmHJJgnPQVBobDPG6k7JozwiY+7atWs9Oc2wkhIZ8GRZWFWJeFVR5TxMXaJPrVixQqxatSrVfyCTzp07a7IqW7as2L59u2XfwsrC2rVra9ffe++9tisNjx8/LurVq6ddj/6MLVZhtjkKz7LaZg9GmzZt6koeWJko2cbRjwQhQcgI4RBUR6ysM5ziSOgRxDNZZnjOItrv8GQtuQ7bfht/TIETPR9/TJHyD+pIZ1zEJ2BBKZ7lhm9EKXPKnAyQAa8MYOCrbk2SExscsYXg4sWLjic3AwcO1CZzCL7utU5B3/fGG29o9ZTtxQoe6UgI+vlhl4+Vfvm2WgTOHazSkvrF8cYbbxTZrtZEzBs44eBsxsqjfF4JZ8cx5H/rrbdq8m/cuLGw2xKMLaZYrSj1NWTIEFvZSj3I6xFw3K4+Sf0OTk9k1pVyUI+waXBaOm372LFjtXLAOJxeTu8N8zrEm1LbKc8//PDDSNY3W9ngHYz+FFV9ZNs+s/tpv3M7pg3afqN89ceXfP0xxYx9Pz+jM47OuES+FP3sJCwrty8byp/yJwP/z0CLFi1MJzeY5LjJKKquNsMKoijKF3Hs5ORNPY4fPz6S9fVDhnLyWrFiRQHnqx9lRr0MYzIA6BpO2GydZ1hVhyyh2OKMZ0RdDrmq31dffaXLpvrqq69axovDirYnnnhC65clSpQQq1evtpQtdGh0HCGQf67amuvnPvXUU5rsVJuGczdx39Qtr/Xr14+kPLF11uzHo9deey2S9fWDDWzfgy6xdfvAgQOJbacqK9rv3I7Pg7Tf0LOxfLdb6lVWeG7NCp1xdMblxQuDRsDaCFA2lA0ZiAcD0lljnMjh/y5duji25WoMNmQ2jJr+EVQejhRjOzt16pToVQft2rVLtRkraPJldcWWLVt0mX2xTRKfZcskkgpgxRHim9klI8j2OXG+H86yESNGaP0M2wcRj8iqTZs3b045GmS/RNxGrJywuh4JNdTtwvmehW/JkiWarKUM5fHhhx+2lKNRvtjWKu+DTTR+n+v/Dx8+LMwSVqCNSe6LPXr00PTiZqV6rvWVzfNpv3M3dgzafqP8YcOGaUyXLl1aizOaDTO8N50ZOuPojIvci5wdNb2jUiaUCRkgA5j4ykmY8Yg4asiyl4kTxABRY3TNnDkz4z2ZyvTze2yRw9ZZY/uQ+THJExzoDoNdtDuqq1381LMsC7HcsJVU6hsZFrPNdgrGn3322VTGz6hnCpZyyMUR26LV1bZIbgFHilldsM2ye/fump6gL8gYsja7Hp8hdl+VKlW0e3r16mV7vVU5SfkcWbFlFlrJuzwiMPq5c+csZanKACtn5X0jR450dI96f5DnsNFwusr6ySPYyrZfB1nvbMvGjyc33HBDqt04ZlteXO6n/c7duDRo+43y77vvPq0vN2jQQPz+++95w3aYfZDOODrj2LHIABkgA2QgJgw0atRIGxzJiY48fvnllxn1iMQH8nocsZ0vzEGH3bOwaqJly5a6+qGOmHz++uuvkamnXRu8fqeumkFAfa/lxOk+OHi6du2q0/fQoUOz3qKKgPZIAAGn7i+//JIXsvSi9z179ojKlStr8sc2SujErCxsV6pUqZJ2LRz6SCpjdq38bOHChZrjH86mRYsW2V4v70vy8bHHHtNkqNphnH/wwQcZ5QOHlnpflGQKhxRW6qn1wzlW+mYbAzLqTHz99ddau/EOi3p9/agf7XfuHHHQX9D2e+fOnaJ8+fIa19hFkeSVrX70Ca9l0BkXkwmYVwXzvtwaS8qf8icDZMBPBtQYTMZJT8+ePTNOAr744gttcIX77baZ+VlvJ2UhnpCxTZj0b9iwIWO7nJQf5WuaN2+utX306NGJby90cfTo0VRMN6nzTDHInOoPE2Nsc3788cfF5cuX80KWTmWjXjd//nzNWYbViVZxy06dOpVykj/wwAOprb/QF5x4mAyq5annWDGnrqSrWrVqaqWcek0+nr/33ntaP5fcy2PHjh0t5SlltWnTJt39dplv5T1hHSdMmKCrm2yX3dbnsOoW9HPUWIovvfRSRj0GXZ8wyqf9zu3YNkj7DX7wPpCr1rGi101c4jD4S9Iz6IyjMy4vXhpJ6rRsS25fgJQ/5Z9LBowr2+SEB0dMkBHnw65+yGYo74HDIiqxyWTwa1k3eZw1a5Zte+zaGpfv4NSQ7cURq+TiUvds6rlixQoBB5xsO7J6ZuscBv9wZmISgbhx2dQvyfcanWVYAYGVEMY2YyUE4gbBUfTII49ousLqH2y7NF4v/8fqxLp162rXI14YYsjJ7/P1iG1ecoIruZdH9AUkybCTzfvvv6/JFPdFRaZYlW3Wrnz4YQGsq6Efpk+fbqtDO/3G6Tva79yNhYO231j1qCacQYbzQ4cO5QXXueiDdMbRGcfORQbIABkgAzFiAFvw5ATOeMyUrfCFF17Q7kVsn1wMPIzP3LFjhyhevLhWL9mmF198MRL1M9bX7/+xkkK2Gcddu3Ylvt1wmg0ePFjXbmxZtYtB5kTuMo5OuXLlRJRWDTmpe5jXHD9+XNxxxx2a/BEbCLIz1gEraevVqyeWL18uatasqV0/ZswYW8f/unXrdElYMl1vfG6S/1dXwar9HuefffZZmg5UWQwZMkTTwfXXX297rXpfkOcHDx4U6G/GtsCBG5Ufe4JsPxyOatujFPohqHbTfufOEQedBm2/kSUXcR4l1+jLXGUenM7pjIvRBCwoo8pyg+tglC1lSwbIgN8MqBmu5GBJHgcOHGg7QVMD8uKXT7/r5rY8rBSRga9lG3C85557LONXuX1GlK9HTDM1cywygMpBLxxTcEiaOSohI2RVNDpQEIBfXZGkyrRIkSJi6dKlrnWOiRccW4jndv/996eC8putglGfJc/RNmwbNeoAsa/UrJBYWTJ37ty064z3ZfofsakQ2wxlJzlgfCY5ZPr+22+/FaVKldImW2ax+pCAAQ772bNni48++kiAH+gVMcDsto6DFyQWUBlYv3591rrN1Ka4fD916lRNNlJG8oikGHbtwKRYXottw3bXhvEdVkea2Rt8ZrdyMoy6hfGMkydPpmKaSp3gKFf30n67H/vRfjuTWZD2G/0GW8uRXRs8Y0wCmxVGf8rXZ9AZR2ccOxgZIANkgAzEiAGsJFMH/+o5gtbbrUZQA7YPHz48p3rHZAUTSrX+OMeKD/zym/SBGbYAqs5RtB3bQczaDWeYcUWkmTNO3gsn3Ztvvqk5UFC2W2ccnCpY5QHHqFFHTv+3csahPepqGjjQdu/ebdp22SYnRzj04NjDqjvU38k9+XjNpEmTNJ3C2YstZ6oc4CTH1lI4h8ASgndLnWOlnF3/xPVqv4ZjBlv5UD50YnQgq8/Nh3OsOpGyNB7Lli1ruzpUXc2I7LS5lBfeM4jLaGwD+vXPP/+c07qFIRe0v127drr2w1Ft9v6l/XbmZKL9dianIO03xiWvvvqqxjVs0rZt2xLfn8OwGVbPoDMuRhMwKyXyc2fGi3KinMgAGUgCAxjsq1vGjJMhs9hPaDcmweq1TrL3BSmv/v376+qDuiFQ8NatW/Ni4Ne3b9+09sMBYiXzBQsW6GIT2TnjUAZWhqmONDfOOMSuev3113XPq1GjhujWrZuYMmVKKpjzmjVrBLYj2v198803ps4XxFVSV9e1aNHC9DorWZh9DucunEeIvbVq1SpLOZrdm0+fQU5qFls4gNWss7ATkGPDhg0FHEenT58WahZnMIAy8DdixIjUn5plD05VNfPq888/rzmYkP2zQYMGuuflk+xlWyFb1Rar58hcK69Tj3BkqqtkMSFXvw/7HFuP1XrjHH0adiHsuuTieaNGjUpr/913323Zdtpv+/En7be9fCTjQdtv2PvGjRtrbGMMcebMGUuuZb14dKY/MznRGUdnHDsYGSADZIAMxIyBV155RRssGSdEb7zxhqk+4eRSr83lr53IBKbWRZ4vXLjQtO5mA5i4fobtW3BQyDarR6xAsmoXtvph5YW8PpMzzhiE2akzDo643r17a8/BahzEDFMdLlZ1dPI5tuEaV9RgYpvtSjZsD0MSiFq1aqUytTqpSz5eg4mV6qRt1qyZ5gjFirhnnnkmtToVmTshnx9++EEgwQO4w5aladOmpXQF50Lt2rXTEj/MmzdPc+IWKlRIIIMoyoFjFnGIsO01W13HXW9YtSr7sfGIvmfWPmxBV681rmY0uyeoz2AP1LrI81w7CINqr1ou7OqAAQNM29+5c2dT3eF+2m97ZwXtt718JINB2+8tW7aIMmXKaHwjy71f737ZBh71uqYzLmYTMAKsB5jyoDzIABnIRwYwsZUTIOMR28LMZIKVcOq1udouBqcgVsCpdcE5Jjhm9U7SZ2j7zTffnNZ2KYuZM2daygDOkdKlS2v3ZnLGGX9Bd+KMg5Nk4sSJAk4U1KlHjx6ao8YvPWAVFrZTyzZbbWV1+7zVq1enVsVh1RcmzG7vz5fr5aRXyr9KlSpizpw5ApmWsUoOjjdkx5TyUOPFYQswMnoiphCuxUo3eR2OmLT16dNH0y2YQ6ZkrFTEykrEpqNu/icQj0/K33iEPsycldCJei0SJ6iyD+scdVftkKwTVlOabdEMq15hPAcxzdStwrLt8miXPZb2236sSvttLx/Jd5D2G8+YPHly6kcXMI24cUjiI5/NozMduZUTnXF0xrGTkQEyQAbIQMwYwGRN3QomJwPyeODAgTSdIkac/B4TPrcDBj+uR6wpxIST9ZDHli1bJvbX14sXL6ayJLZv315zcsl2G49myQ6k3MOYzGEVFNhAvTp16hRIEPZPP/1U54xVY4rJtro9oj/A0aOuxHJbRr5cjz6IuG9G9vB/tWrV0rYZYiWc8Vo42bBd2bhiAo42Yxwt3AsnHvQjk5Pki6zt2olVhUa5yv+///77NPusJn6A/I2yt3uWX9/hBxysPpX1lEdsu02qbsH0ypUrxdNPP62LwSnbrh6XLFmSpjcpe9pva0cG7be1bCQ/8hik/caq+LZt22r9GyuZEapAPptH53pyIys642I2AXOjXF4bTKehXClXMkAGosDACy+8oA2a1AkBzseNG5c2gHryySe165EVM+w2XLlyRdx7771aHWSdsUoKcUrCrk8Qz8PKkF9//TW1rRMxlVq3bq2L8yTbbHWUge7N6hb0ZA6Texm4GQ5TPxIqGNuBZxhjBXbv3l2LKWa83un/cBIgGYZfiSCcPjeO12Hii22ScvUjWMT2UzjRzJz4n3/+uZZZD9dCxlgRh3KM7cdn//nPf7SVFbj+uuuuS2XKzYXzyFi/KP0P56SVHUA/NNZVXXEIR57x+6D/h27btGmTVmfwcPTo0dDrE0R7Yb+x8gjON7xDO3TooMt2baUv+fmuXbss5UD7bT1upP22lo2R8yDtNxKvYAWz5BkOaK5kdq4bo66c/k9nHJ1xli8OpxDxuuA7KmVMGZMBMmBkAFu/5KDJeGzSpEmabb/zzju16+HIM5YX9P9qHDK1vnXq1BGtWrWK7R9W9cG5icD0Ztu31LbaneNeu21eQU/m8Iu73IKlBt33kwtjMgCsmEL8wGyfgfiHyOL44IMP+r6tNtu6RfF+OMYQ9wtbw7G1zirpC+qO7c4ff/xxKqMqtlGfOnXKVl9YIYWtrHAeYfUcuIqiDHJdJzBrZQ/MsmLDzsjr4TgNu/6IRSqfrx6x7T7O9htJc5o3b55KUgLHsdo2N+dwaNutDqT9th7D0X5by8asnwdlv81CEpg9n5+501cmedEZR2dc6C/0TFDye387OeVJeZKBZDKAlWZ2zh/8wi91DycPYnPJycWECRO07+Q1QR4RtF0+m8d/mcoCzjw7HQQ9mcOECDzBQRZUpt3t27eLsmXLau3HqhrEYbJrt5PvwDO4wmpEsxVbTsrgNcm0k1HVK2zyDTfcoPUFo100rrJSr0VQ9TDbha3lxvrxf70dRwxFO53QflvbF9pva9nYMeXnd3DwqatvsUIuV3Ep/WxXHMqiM47OONuXRxwgZh1zb8SpA+qADOSGAWRvs5oUzZgxQ7Pv2EakXodVMWHp7LvvvhOFCxfWPV+tC8//f1LXpUsXW50EPZmT2xELFiyY2k782GOPiWz/wKfqbENmTXV7pJrJ0yuP2OKEFXFwJG7cuNFWhl6fwftyY9+SLnfjlm3VFo4cOVJjGSuu1O9khtow5IPt6uoPOWo9eP6PQw4r7Oz0QfttbkNov83lYsdSEN+dOHFCqLsnunXrxi2qIfmI6IwLSdBBdByWGQ0DRj1QD2SADOSKAWwfs5oQwUEh67V27Vrddfv379e+k9cEccTqvMqVK+uebVXffP/cLhMfdBP0ZA5ZL/12mqqZUvHLO1b0qHru2bNn1vHiIJcyZcqIe+65R5w5cyYUroPoKywz/94jGzZs0PUHtW9gy7hkAqvk1O++/fZb7Tt5TRBH9Cc187FaB57/44iDLPr162erE9pv8/5N+20ulyD6s12Z69evFyVLlkzZmVKlSgn8b3c9v/NPb3TG0RnHzkYGyAAZIAMxZeDChQu64OrqBAkrkKRzAqvk5HfYhgjHSNCDKazmaNSokfZc+Xwe9ZM4KQ84Vu10EvRkbtmyZSmWEPsIv5AjjlK2f8jMJrfbIRC0cSWnWaIROxkYv8OWVBkIH85MblH1b4JglDX/91+24BVbtaUNMB4RUB1yRywn9bvff//d1lb4oSu8I7DaS30uz81tN+SCeIp2cqf9Tu8/tN/pMrFjKKjvVD2A5SeeeEJgbBnU81iuXu90xsV0AkaQ9SBTHpQHGSAD+cqAmoreOFlCIHXIBb/ay+9q1aoVyiALWTLlM3m0nsRJ2fz444+2egl6Mrdjx45UPDdsU1W3OPvVr+CMw7ZX2V48B7EEsykf2Wexgqh8+fICMe+yKYv38h2SCwZ69Oih9QnZN+Tx7bffTjGNDLXyMyQZCKOer7/+uvZM+Wwere34119/basX2u90+0L7nS6TMPq28RnYwXD77ben+nvVqlUFxgLGa/h/cLqiM47OOHY4MkAGyAAZiDEDcLhZTZJk1j1ku5PXtGnTJnB9T58+XXuefC6P1hO5TJn4MBDevHmzLmFH06ZNbTOHIgtm165dNT0UKVIklRXTalCN1TZIIgE9gZfz58/7ygmccarj2A9n3Lx581IJJzp06CAuXbrka32t5MTPg5uU5KNsV65cqfVRo43E1mvIRO3HjRs3DpxzbFk31oX/W9tvyAaOJTt+ab/T7Qbtd7pM7BjK5js4g2E7kP0Y/VuuIscRWa+xk6Jo0aKpH8jkd9k8j/c61y2dcTGegBF056BTVpQVGSADSWXg9OnTuqD46qSpWLFiqe0GatyfV1991XbSkK2cEGtEDdKv1ofn5hM66CeT3JGJFLHRpAybNGmibUM2u9fojEM8uCVLllg+BwPwESNGpMpHrLdVq1ZZXmv2vEyfGbO1oR3YYup14I+A03AeFi9eXCD5RKbn83u+A6LIAJzUiNEk+7XxCCePut3/2WefDZR1rIpBnzLWg/+b227IBcljkB3Xji/ab739of3Wy8OOnWy/w5bTRx55ROvT+EEWYURQLpIeValSJRUvFlltwwhhkm17knY/nXF0xtm+PJIGPNsTnvGnrClrMhAeA0jWYDVZwq+gWIUkv892a6CdXjHAq1ChgvYs+UwerSdykA1WotnJFd/t3btXJ1tsz7RbjWGM0YZYgR988IHtc/bt2ydq1qyZ0h8cAHblZ6qv2ffGJBFwKMKZbHat3Wdw4I0ZM0ZgRSEmGcjIZ3c9vwvPFlHW7mXdqVMnS5s5a9YsUa5cOe17bFkNUsbqDze02/Z2W8oHPwpk0gnt9z/9gvb7H1lk4saP7zEu69ixY8qGVKxYUSABzJEjR1Lv0LJlywpsTf300089/zDmRx3zuQw64+iMy/gCyecOwraH+8KgvClvMuCNAbttoa1bt9Ymcpg8IINfUHKGU0ROUHh0NpGDnPr3759RJxg8Y4uJlCtiR+3cudP0Pvy6DadriRIltOvhuMrkiMUkCfHi4LjDczCA9zNYPFZD3HXXXVqd8Jx3333X9SQAySawGgWx4vDLflA8s1xv9ohycyc3Y4IG2cdxRBIV9f9MiV6ylT22s6vP43lmO96lS5eMNoj2+58+Qfv9jyyy7a9O78dYQX33ol8jTtzYsWM9/SDm9Lm8LrOu6YyjMy7jC4QdKXNHoowoIzJABnLJAALwWk2ajFuOTp48GZjdv3jxomjfvj3/XMpg+fLlGXWCGG7GFZADBw4U2I6qsgeH6KBBgwR+Ab/pppt0XMDpl2kbCra0vPDCC9p9GMCvWbPGtcNMrZN6/sknn+ichHAqOmk/yoCzcOnSpQL3wGngxZGn1oXntNtRYAB9GyEFzGy4cct/pkQv2bYHmRRpw929wxYtWqSzwWY6oP2m/TbjIuzPjh8/Lg4fPiywcj7sZ/N55u9bOuPojGNnJANkgAyQgQQwgOC8ZpM59TPEHMsU24YDJvMBU67lAkcUsitihZvUKc4xccZqGcR4Gz58uLjhhhtSq8awJRQrNuS1OCI21YABA1LOukmTJlk65uDQ69mzp+5Z2L6GzI9Tp04VcKitXr1afPnll7Z/yDB49uxZnX2BM3DcuHHa6jvUCyv4Ro4caRsD7+DBg+K5555L3YdA05MnT7asf651xedHsw9FWS+I46T2VbNz9HcZ6ynKbWHd0vmn/ab9Zr9I7xeUyf8EnXEJmIARZHZuMkAGyAAZgIPDbAKnftawYUOdY4TcxIsbrIA0bjVR9YtzxOzDNiD88q1mYZTXwfGFIPDI7ocJohUDWHGHFR/ZxJBCIgg45IzPgENu5syZAt/LeuFYsmRJgW3VSOwAZ+H48ePFyy+/nMoCJ1cIIb7NZ599Zlt34/P4f7w4z0d9IbOk2hfMzhHPMR9lk5Q2037/KxWfjPab9jgpfdqPdtAZR2ccX+xkgAyQATKQAAYOHDiQcTLnJLaNH4MLlhHcYHvXrl3izjvvNNV1/fr1xbZt21L92ZhNFVtWsbLu1KlTrvo7nHorVqwQvXr1EihfDSZv5jBQP7Nyxkk+0BbEpZMx6tR7jecINP3aa68JxJ2T9/MYHGeUbbiytcuKLftCy5YtyX7M39W037TftK3h2taoy5vOuJgb9agDxvrR4JABMkAGwmOgbt26pk4aOZkbPXo0J3MJeO8j/tCCBQtSK9zgzMLW03Xr1um2bWL1GbaUYhUctpMaY8tFqV9ixcicOXNSW2ORWbZZs2ap+HiIXzVs2LBU/bk9Lzw7EiU28qkuLVq0sLXfffv2pf2m/Y4cA7TftM35ZKf9biudcQkw6n5DwfJoVMkAGSAD8WQAMcOk483suGTJksgN5MlaPFmj3qg3MuAvA9OmTbO13/ieMvdX5pQn5UkGyEAuGaAzjs44vtjJABkgA2QgIQwgfb2ZE05+hu9zOejgsznoJQNkgAyYM4AVRtJWmx2xwpWyM5cd5UK5kAEyEEcG6IxLyAQsjvCxzjSaZIAMkAF/GUCm1BtvvNFyQnfx4kVO5vjeJwNkgAxElIFGjRpZ2u+jR49SbxHVG8cy/o5lKE/KM18YoDOORp0vdjJABsgAGUgQA8hEabaq4vrrr6eeE6TnfBmosp2clOUTA1OmTDG136VKlRL4sSWfZMG2su+TATKQdAbojOPAnC92MkAGyAAZSBADf/zxh6hevbpuQlegQAGxfv166jlBek76AJXt4yQsHxlA9uI6dero7Dd+XFm6dCntN+03GSADZCBhDNAZlzCF5uPAhW3mgJ0MkAEyoGfg7Nmz4pVXXhEtW7YUjz/+uNi1axcHcHzfkwEyQAZiwADCCSCLMOx3u3btxKZNm6i3GOiN4xD9OITyoDzIQGYG6IyjcecLngyQATJABsgAGSADZIAMkAEyQAbIABkgA2QgJAbojAtJ0PQMZ/YMU0aUERkgA2SADJABMkAGyAAZIANkgAyQATKQdAbojKMzjp5vMkAGyAAZIANkgAyQATJABsgAGSADZIAMkIGQGKAzLiRBJ92ry/bxlwsyQAbIABkgA2SADJABMkAGyAAZIANkgAxkZoDOODrj6PkmA2SADJABMkAGyAAZIANkgAyQATJABsgAGQiJATrjQhI0PcOZPcOUEWVEBsgAGSADZIAMkAEyQAbIABkgA2SADCSdATrj6Iyj55sMkAEyQAbIABkgA2SADJABMkAGyAAZIANkICQG6IwLSdBJ9+qyffzlggyQATJABsgAGSADZIAMkAEyQAbIABkgA5kZoDOOzjh6vskAGSADZIAMkAEyQAbIABkgA2SADJABMkAGQmKAzriQBE3PcGbPMGVEGZEBMlk4cjQAAATDSURBVEAGyAAZIANkgAyQATJABsgAGSADSWeAzjg64+j5JgNkgAyQATJABsgAGSADZIAMkAEyQAbIABkIiQE640ISdNK9umwff7kgA2SADJABMkAGyAAZIANkgAyQATJABshAZgbojKMzjp5vMkAGyAAZIANkgAyQATJABsgAGSADZIAMkIGQGKAzLiRB0zOc2TNMGVFGZIAMkAEyQAbIABkgA2SADJABMkAGyEDSGaAzjs44er7JABkgA2SADJABMkAGyAAZIANkgAyQATJABkJigM64kASddK8u28dfLsgAGSADZIAMkAEyQAbIABkgA2SADJABMpCZATrj6Iyj55sMkAEyQAbIABkgA2SADJABMkAGyAAZIANkICQG6IwLSdD0DGf2DFNGlBEZIANkgAyQATJABsgAGSADZIAMkAEykHQG6IyjM46ebzJABsgAGSADZIAMkAEyQAbIABkgA2SADJCBkBigMy4kQSfdq8v28ZcLMkAGyAAZIANkgAyQATJABsgAGSADZIAMZGaAzjg64+j5JgNkgAyQATJABsgAGSADZIAMkAEyQAbIABkIiQE640ISND3DmT3DlBFlRAbIABkgA2SADJABMkAGyAAZIANkgAwknQE64+iMo+ebDJABMkAGyAAZIANkgAyQATJABsgAGSADZCAkBuiMC0nQSffqsn385YIMkAEyQAbIABkgA2SADJABMkAGyAAZIAOZGaAzjs44er7JABkgA2SADJABMkAGyAAZIANkgAyQATJABkJigM64kARNz3BmzzBlRBmRATJABsgAGSADZIAMkAEyQAbIABkgA0lngM44OuPo+SYDZIAMkAEyQAbIABkgA2SADJABMkAGyAAZCIkBOuNCEnTSvbpsH3+5IANkgAyQATJABsgAGSADZIAMkAEyQAbIQGYG6IyjM46ebzJABsgAGSADZIAMkAEyQAbIABkgA2SADJCBkBigMy4kQdMznNkzTBlRRmSADJABMkAGyAAZIANkgAyQATJABshA0hmgM47OOHq+yQAZIANkgAyQATJABsgAGSADZIAMkAEyQAZCYoDOuJAEnXSvLtvHXy7IABkgA2SADJABMkAGyAAZIANkgAyQATKQmQE64+iMo+ebDJABMkAGyAAZIANkgAyQATJABsgAGSADZCAkBuiMC0nQ9Axn9gxTRpQRGSADZIAMkAEyQAbIABkgA2SADJABMpB0BuiMozOOnm8yQAbIABkgA2SADJABMkAGyAAZIANkgAyQgZAYoDMuJEEn3avL9vGXCzJABsgAGSADZIAMkAEyQAbIABkgA2SADGRmgM44OuPo+SYDZIAMkAEyQAbIABkgA2SADJABMkAGyAAZCIkBOuNCEjQ9w5k9w5QRZUQGyAAZIANkgAyQATJABsgAGSADZIAMJJ0BOuPojKPnmwyQATJABsgAGSADZIAMkAEyQAbIABkgA2QgJAbojAtJ0En36rJ9/OWCDJABMkAGyAAZIANkgAyQATJABsgAGSADmRmgM47OOHq+yQAZIANkgAyQATJABsgAGSADZIAMkAEyQAZCYoDOuJAETc9wZs8wZUQZkQEyQAbIABkgA2SADJABMkAGyAAZIANJZ+D/AF0Jo/zrLtKLAAAAAElFTkSuQmCC"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image.png](attachment:image.png)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:23: RuntimeWarning: invalid value encountered in double_scalars\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0..100..200..300..400..500..600..700..800..900..1000..1100..1200..1300..1400..1500..1600..1700..1800..1900..2000..2100..2200..2300..2400..2500..2600..2700..2800..2900..3000..3100..3200..3300..3400..3500..3600..3700..3800..3900..4000..4100..4200..4300..4400..4500..4600..4700..4800..4900..5000..5100..5200..5300..5400..5500..5600..5700..5800..5900..6000..6100..6200..6300..6400..6500..6600..6700..6800..6900..7000..7100..7200..7300..7400..7500..7600..7700..7800..7900.."
     ]
    }
   ],
   "source": [
    "#构建相似度矩阵\n",
    "movie_sim_array = np.zeros(shape = (movie_quantity,movie_quantity))\n",
    "\n",
    "import random\n",
    "for movie_index1 in range(movie_quantity):\n",
    "    movie_user_index1 = set(movie_user_dict[movie_index1])\n",
    "    for movie_index2 in range(movie_index1+1, movie_quantity):\n",
    "        movie_user_index2 = set(movie_user_dict[movie_index2])\n",
    "        movie_user_union = list(\n",
    "#             movie_user_index1 & movie_user_index2\n",
    "        )\n",
    "        #如果公共用户过多，则需要随机抽取一定数量\n",
    "        if len(movie_user_union)>300:\n",
    "            movie_user_union = random.sample(movie_user_union, 300)\n",
    "            # 如果公共用户大于300，就随机取出300个movie_user_union中的值。最多是300\n",
    "        movie1_user_rating_v = user_movie_rating_array[:,movie_index1][movie_user_union]\n",
    "        movie2_user_rating_v = user_movie_rating_array[:,movie_index2][movie_user_union]   \n",
    "        \n",
    "        # 时间惩罚向量\n",
    "        time_punish_v = np.around(1/(1+np.abs(user_movie_time_array[:,movie_index1][movie_user_union] - \n",
    "                                           user_movie_time_array[:,movie_index2][movie_user_union])/200000), 3)\n",
    "        #用户活跃度惩罚向量\n",
    "        this_user_popular_punish_v = user_popular_punish_v[movie_user_union]\n",
    "        sim = np.around((movie1_user_rating_v * movie2_user_rating_v * time_punish_v * this_user_popular_punish_v).sum()/ np.sqrt(np.square(movie1_user_rating_v).sum()* np.square(movie2_user_rating_v).sum()),3)\n",
    "#         print(sim)\n",
    "        movie_sim_array[movie_index1][movie_index2] = sim\n",
    "        movie_sim_array[movie_index2][movie_index1] = sim\n",
    "\n",
    "    if movie_index1%100 == 0:print(movie_index1,end= '..')\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0., nan, nan, ..., nan, nan, nan],\n",
       "       [nan,  0., nan, ..., nan, nan, nan],\n",
       "       [nan, nan,  0., ..., nan, nan, nan],\n",
       "       ...,\n",
       "       [nan, nan, nan, ...,  0., nan, nan],\n",
       "       [nan, nan, nan, ..., nan,  0., nan],\n",
       "       [nan, nan, nan, ..., nan, nan,  0.]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "movie_sim_array"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 生成推荐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "ename": "SyntaxError",
     "evalue": "keyword can't be an expression (<ipython-input-25-6fc58bc14409>, line 8)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  File \u001b[1;32m\"<ipython-input-25-6fc58bc14409>\"\u001b[1;36m, line \u001b[1;32m8\u001b[0m\n\u001b[1;33m    df_sim_sum = pd.DataFrame(movie_sim_array[fav_movie_index].sum(axis=0).coolumns=['sim_sum'])\u001b[0m\n\u001b[1;37m                             ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m keyword can't be an expression\n"
     ]
    }
   ],
   "source": [
    "## 111111111111111\n",
    "user_recommend = {}\n",
    "\n",
    "for user_index in range(user_quantity):\n",
    "    fav_movie_index = np.where(\n",
    "        user_movie_rating_array[user_index] >= 3\n",
    "    )[0].tolist()\n",
    "    df_sim_sum = pd.DataFrame(movie_sim_array[fav_movie_index].sum(axis=0).coolumns=['sim_sum'])\n",
    "    user_recommend[user_index] = df_sim_sum.query(\n",
    "        'sim_sum > 0'\n",
    "    ).sort_values(by = \"sim_sum\", ascending= False).index[:100].tolist()\n",
    "    if user_index % 100 ==0: print(user_index,end = '..')\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取测试集\n",
    "\n",
    "df_rating_text = pd.read_csv('./data/rating_text.csv')\n",
    "\n",
    "df_rating_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 处理user_id, movie_id, 统一用index\n",
    "\n",
    "def deal_with_userid(user_id):\n",
    "    return user_id_to_index_dict[user_id] if user_id in user_id_to_index_dict.keys() else:None\n",
    "    \n",
    "def deal_with_movieid(movie_id):\n",
    "    return movie_id_to_index_dict[movie_id] if movie_id in movie_id_to_index_dict.keys() else:None\n",
    "\n",
    "df_rating_text['user_id'] = df_rating_text['user_id'].apply(deal_with_userid)\n",
    "df_rating_text['movie_id'] = df_rating_text['movie_id'].apply(deal_with_movieid)\n",
    "\n",
    "df_rating_text = df_rating_text.dropna()# 如果有NAN的数据，后面的类型转换会变为0 \n",
    "df_rating_text.columns = ['user_index','movie_index','rating','timestamp']\n",
    "df_rating_text['user_index'] = df_rating_text['user_index'].astype(int)\n",
    "df_rating_text['movie_index'] = df_rating_text['movie_index'].astype(int)\n",
    "\n",
    "df_rating_text.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_fav = {}\n",
    "\n",
    "for user_index, groupby_userindex in df_rating_text.groupby('user_index'):\n",
    "    movies_rating = groupby_userindex.groupby('movie_index')['rating'].mean()\n",
    "    \n",
    "    user_fav[user_index] = movies_rating[\n",
    "        movies_rating > 3\n",
    "    ].index.tolist()\n",
    "    if user_index % 100 == 0:print(user_index, end='..')\n",
    "        "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 计算准确率和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "union_quantity = 0\n",
    "recommend_quantity = 0\n",
    "fav_quantity = 0\n",
    "\n",
    "\n",
    "for user_index in user_recommend.keys():\n",
    "    if user_index in user_fav.keys():\n",
    "        union_quantity += len(\n",
    "            set(user_recommend[user_index]) & set(user_fav[user_index])\n",
    "        )\n",
    "        recommend_quantity += len(user_recommend[user_index])\n",
    "        fav_quantity += len(user_fav[user_index])\n",
    "print('precision', union_quantity/recommend_quantity)\n",
    "print('precision', union_quantity/fav_quantity)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 项目总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 准确率和召回率的评价"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
